#734 by GitHub stars
gooseworks-ai/goose-skills
Library of Growth & GTM skills + data APIs for Claude Code, Codex, Cursor to run ads, social, content, lead gen, seo and data scraping
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
docs/skill-template/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
drafts/marketing/learn-my-brand/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
drafts/marketing/make-product-photos/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
drafts/marketing/make-video-ads/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/entry/goose-ads/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/entry/goose-product-photos/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/entry/goose-video/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/entry/goose-video-local/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/entry/gooseworks/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/entry/make-custom-video/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/ad-policy-check/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/analyze-performance/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/analyze-performance-call-and-learn/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/analyze-performance-diagnose/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/analyze-performance-intake/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/analyze-performance-rank-and-read/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/analyze-performance-revenue-join/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/claims-gate/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/email-lifecycle/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/email-lifecycle-broadcast-planner/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/email-lifecycle-flow-writer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/email-lifecycle-lifecycle-audit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/email-lifecycle-offer-math/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/email-lifecycle-send-check/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/honest-review/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/improve-search-visibility/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/improve-search-visibility-citation-check/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/improve-search-visibility-entity-footprint/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/improve-search-visibility-fix-writer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/improve-search-visibility-page-and-foundation-check/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/improve-search-visibility-question-set/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/improve-search-visibility-store-listing-audit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-content/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-content-content-brief/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-content-source-to-units/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-content-two-pass-edit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-static-ads/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-static-ads-ad-copy/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-static-ads-claims-extract/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-static-ads-compose/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-static-ads-concept-grid/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-static-ads-copy-variants/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-static-ads-find-references/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-static-ads-fix-rejected/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-static-ads-graphic-request/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/make-static-ads-render-review/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/marketing-data-access/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/marketing-guide/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/outcomes-ledger/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/plan-campaign/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/plan-campaign-brief-and-assets/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/plan-campaign-budget-and-tests/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/plan-campaign-channel-decision/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/plan-campaign-goal-chain/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-audience/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-audience-account-sourcing/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-audience-fit-definition/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-audience-people-and-contacts/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-audience-score-segment-qa/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-audience-segment-pass/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-audience-signals-and-hooks/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-competitors/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-competitors-category-pass/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-competitors-edge-cases/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-competitors-rival-pass/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-market/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-market-edge-cases/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-market-listening/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/research-market-market-pass/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/run-memory/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/run-organic-social/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/run-organic-social-account-audit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/run-organic-social-plan-calendar/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/run-organic-social-platform-research/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/run-organic-social-post-check/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/run-paid-campaigns/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/run-paid-campaigns-apply-and-log/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/run-paid-campaigns-draft-moves/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/run-paid-campaigns-health-gate/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/run-paid-campaigns-weekly-read/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/save-learning/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/save-to-brain/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/spend-gate/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/voice-card/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/where-to-start/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/where-to-start-situation-save/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/work-with-creators/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/work-with-creators-brief-writer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/work-with-creators-creator-discovery/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/work-with-creators-creator-vetting/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/work-with-creators-rate-and-deal/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/write-outreach/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/write-outreach-draft-sequence/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/write-outreach-outreach-qa/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/write-outreach-reply-reader/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/marketing/write-report/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/ad-angle-miner/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/ad-campaign-analyzer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/ad-lead-quality-analyzer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/ad-management-intake/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/ads-north-star-strategy/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/answer-ads-questions/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/brand-research/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/comment-mining/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/company-contact-finder/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/competitor-ad-intelligence/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/get-brand-assets/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/goose-graphics/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/goose-graphics-create-format/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/goose-graphics-create-style/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/hacker-news-scraper/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/job-posting-intent/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/launch-meta-ad-campaign/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/lead-qualification/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/linkedin-profile-post-scraper/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/meta-ad-manager/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/meta-ad-policy-checker/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/meta-ads-analyzer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/reddit-post-finder/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/remix-graphic-ad-from-reference/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/scrapecreators-api/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/shared/transcript-intelligence/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/animate-image/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/caption-burn/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/compose-creator-layer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/create-apple-notes-mockup/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/create-chatgpt-mockup/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/create-creator-takes-h3/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/create-image-fal/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/create-image-gpt-image-fal/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/create-imessage-mockup/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/create-kinetic-typography/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/create-music-elevenlabs/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/create-video-fal/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/create-video-seedance-2-fal/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/create-vo-elevenlabs/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/footage-cutlist/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/media-proxy/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/mix-master/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-3d-character-explainer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-3d-product-showcase/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-absurdist-explainer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-airdrop-carousel/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-brand-identity-reveal/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-cartoon-music-video/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-cgi-sizzle/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-chatgpt-chat/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-cinematic-music-video/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-cosmic-mythology-voiceover/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-creator-pip-listicle/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-editorial-motion-podcast/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-flat-vector-explainer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-food-product-sizzle/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-glassy-matte-grwm/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-hand-swipe-flavor-listicle/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-hook-replacement/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-hypermotion/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-ig-live-gallery/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-imessage-chat/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-ios-keyboard/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-logo-equation-card/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-model-comparison-grid/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-mosaic-grid-reveal/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-multiworld/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-myth-vs-fact/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-narrated-ugc-wardrobe-stitch/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-offer-ad/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-podcast-skit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-proof-points-overlay/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-song-mv/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-split-screen-creator/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-stopmotion-hand-swatch-cycle/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-street-interview/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-value-prop/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-vignette/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-vo-anchored-motion-listicle/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/render-whiteboard-explainer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/review-finished-ad/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/review-ugc-render/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/stitch-videos-ffmpeg/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/ugc-fixloop/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/verify-product-image/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/video-production-harness/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/watch/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
skills/video/write-video-ad-script/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1add09bd8e0d → 1add09bd8e0d
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1add09bd8e0d
No earlier version was observed for comparison.
Verified commit 1add09bd8e0d057e91e25c96b9282498e2fcb2a2
git clone --filter=blob:none --no-checkout https://github.com/gooseworks-ai/goose-skills.git .hotskills/gooseworks-ai-goose-skills && git -C .hotskills/gooseworks-ai-goose-skills checkout --detach 1add09bd8e0d057e91e25c96b9282498e2fcb2a2
# Copy each selected skill directory from .hotskills/gooseworks-ai-goose-skills into .claude/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/gooseworks-ai/goose-skills.git .hotskills/gooseworks-ai-goose-skills && git -C .hotskills/gooseworks-ai-goose-skills checkout --detach 1add09bd8e0d057e91e25c96b9282498e2fcb2a2
# Copy each selected skill directory from .hotskills/gooseworks-ai-goose-skills into .agents/skills/<skill-name>/Heat
6.9- Star growth, last 7 daysAhead of 86% of tracked repositories
- Star growth, last 24 hoursAhead of 97% of tracked repositories
- Rank movement, last 7 daysAhead of 32% of tracked repositories
- Commits, last 30 daysAhead of 99% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
- <slug>
docs/skill-template - learn-my-brand
drafts/marketing/learn-my-brand - make-product-photos
drafts/marketing/make-product-photos - make-video-ads
drafts/marketing/make-video-ads - goose-ads
skills/entry/goose-ads - goose-product-photos
skills/entry/goose-product-photos - goose-video
skills/entry/goose-video - goose-video-local
skills/entry/goose-video-local - gooseworks
skills/entry/gooseworks - make-custom-video
skills/entry/make-custom-video - ad-policy-check
skills/marketing/ad-policy-check - analyze-performance
skills/marketing/analyze-performance - analyze-performance-call-and-learn
skills/marketing/analyze-performance-call-and-learn - analyze-performance-diagnose
skills/marketing/analyze-performance-diagnose - analyze-performance-intake
skills/marketing/analyze-performance-intake - analyze-performance-rank-and-read
skills/marketing/analyze-performance-rank-and-read - analyze-performance-revenue-join
skills/marketing/analyze-performance-revenue-join - claims-gate
skills/marketing/claims-gate - email-lifecycle
skills/marketing/email-lifecycle - email-lifecycle-broadcast-planner
skills/marketing/email-lifecycle-broadcast-planner - email-lifecycle-flow-writer
skills/marketing/email-lifecycle-flow-writer - email-lifecycle-lifecycle-audit
skills/marketing/email-lifecycle-lifecycle-audit - email-lifecycle-offer-math
skills/marketing/email-lifecycle-offer-math - email-lifecycle-send-check
skills/marketing/email-lifecycle-send-check - honest-review
skills/marketing/honest-review - improve-search-visibility
skills/marketing/improve-search-visibility - improve-search-visibility-citation-check
skills/marketing/improve-search-visibility-citation-check - improve-search-visibility-entity-footprint
skills/marketing/improve-search-visibility-entity-footprint - improve-search-visibility-fix-writer
skills/marketing/improve-search-visibility-fix-writer - improve-search-visibility-page-and-foundation-check
skills/marketing/improve-search-visibility-page-and-foundation-check - improve-search-visibility-question-set
skills/marketing/improve-search-visibility-question-set - improve-search-visibility-store-listing-audit
skills/marketing/improve-search-visibility-store-listing-audit - make-content
skills/marketing/make-content - make-content-content-brief
skills/marketing/make-content-content-brief - make-content-source-to-units
skills/marketing/make-content-source-to-units - make-content-two-pass-edit
skills/marketing/make-content-two-pass-edit - make-static-ads
skills/marketing/make-static-ads - make-static-ads-ad-copy
skills/marketing/make-static-ads-ad-copy - make-static-ads-claims-extract
skills/marketing/make-static-ads-claims-extract - make-static-ads-compose
skills/marketing/make-static-ads-compose - make-static-ads-concept-grid
skills/marketing/make-static-ads-concept-grid - make-static-ads-copy-variants
skills/marketing/make-static-ads-copy-variants - make-static-ads-find-references
skills/marketing/make-static-ads-find-references - make-static-ads-fix-rejected
skills/marketing/make-static-ads-fix-rejected - make-static-ads-graphic-request
skills/marketing/make-static-ads-graphic-request - make-static-ads-render-review
skills/marketing/make-static-ads-render-review - marketing-data-access
skills/marketing/marketing-data-access - marketing-guide
skills/marketing/marketing-guide - outcomes-ledger
skills/marketing/outcomes-ledger - plan-campaign
skills/marketing/plan-campaign - plan-campaign-brief-and-assets
skills/marketing/plan-campaign-brief-and-assets - plan-campaign-budget-and-tests
skills/marketing/plan-campaign-budget-and-tests - plan-campaign-channel-decision
skills/marketing/plan-campaign-channel-decision - plan-campaign-goal-chain
skills/marketing/plan-campaign-goal-chain - research-audience
skills/marketing/research-audience - research-audience-account-sourcing
skills/marketing/research-audience-account-sourcing - research-audience-fit-definition
skills/marketing/research-audience-fit-definition - research-audience-people-and-contacts
skills/marketing/research-audience-people-and-contacts - research-audience-score-segment-qa
skills/marketing/research-audience-score-segment-qa - research-audience-segment-pass
skills/marketing/research-audience-segment-pass - research-audience-signals-and-hooks
skills/marketing/research-audience-signals-and-hooks - research-competitors
skills/marketing/research-competitors - research-competitors-category-pass
skills/marketing/research-competitors-category-pass - research-competitors-edge-cases
skills/marketing/research-competitors-edge-cases - research-competitors-rival-pass
skills/marketing/research-competitors-rival-pass - research-market
skills/marketing/research-market - research-market-edge-cases
skills/marketing/research-market-edge-cases - research-market-listening
skills/marketing/research-market-listening - research-market-market-pass
skills/marketing/research-market-market-pass - run-memory
skills/marketing/run-memory - run-organic-social
skills/marketing/run-organic-social - run-organic-social-account-audit
skills/marketing/run-organic-social-account-audit - run-organic-social-plan-calendar
skills/marketing/run-organic-social-plan-calendar - run-organic-social-platform-research
skills/marketing/run-organic-social-platform-research - run-organic-social-post-check
skills/marketing/run-organic-social-post-check - run-paid-campaigns
skills/marketing/run-paid-campaigns - run-paid-campaigns-apply-and-log
skills/marketing/run-paid-campaigns-apply-and-log - run-paid-campaigns-draft-moves
skills/marketing/run-paid-campaigns-draft-moves - run-paid-campaigns-health-gate
skills/marketing/run-paid-campaigns-health-gate - run-paid-campaigns-weekly-read
skills/marketing/run-paid-campaigns-weekly-read - save-learning
skills/marketing/save-learning - save-to-brain
skills/marketing/save-to-brain - spend-gate
skills/marketing/spend-gate - voice-card
skills/marketing/voice-card - where-to-start
skills/marketing/where-to-start - where-to-start-situation-save
skills/marketing/where-to-start-situation-save - work-with-creators
skills/marketing/work-with-creators - work-with-creators-brief-writer
skills/marketing/work-with-creators-brief-writer - work-with-creators-creator-discovery
skills/marketing/work-with-creators-creator-discovery - work-with-creators-creator-vetting
skills/marketing/work-with-creators-creator-vetting - work-with-creators-rate-and-deal
skills/marketing/work-with-creators-rate-and-deal - write-outreach
skills/marketing/write-outreach - write-outreach-draft-sequence
skills/marketing/write-outreach-draft-sequence - write-outreach-outreach-qa
skills/marketing/write-outreach-outreach-qa - write-outreach-reply-reader
skills/marketing/write-outreach-reply-reader - write-report
skills/marketing/write-report - ad-angle-miner
skills/shared/ad-angle-miner - ad-campaign-analyzer
skills/shared/ad-campaign-analyzer - ad-lead-quality-analyzer
skills/shared/ad-lead-quality-analyzer - ad-management-intake
skills/shared/ad-management-intake - ads-north-star-strategy
skills/shared/ads-north-star-strategy - answer-ads-questions
skills/shared/answer-ads-questions - brand-research
skills/shared/brand-research - comment-mining
skills/shared/comment-mining - company-contact-finder
skills/shared/company-contact-finder - competitor-ad-intelligence
skills/shared/competitor-ad-intelligence - get-brand-assets
skills/shared/get-brand-assets - goose-graphics
skills/shared/goose-graphics - goose-graphics-create-format
skills/shared/goose-graphics-create-format - goose-graphics-create-style
skills/shared/goose-graphics-create-style - hacker-news-scraper
skills/shared/hacker-news-scraper - job-posting-intent
skills/shared/job-posting-intent - launch-meta-ad-campaign
skills/shared/launch-meta-ad-campaign - lead-qualification
skills/shared/lead-qualification - linkedin-profile-post-scraper
skills/shared/linkedin-profile-post-scraper - meta-ad-manager
skills/shared/meta-ad-manager - meta-ad-policy-checker
skills/shared/meta-ad-policy-checker - meta-ads-analyzer
skills/shared/meta-ads-analyzer - reddit-post-finder
skills/shared/reddit-post-finder - remix-graphic-ad-from-reference
skills/shared/remix-graphic-ad-from-reference - scrapecreators-api
skills/shared/scrapecreators-api - transcript-intelligence
skills/shared/transcript-intelligence - animate-image
skills/video/animate-image - caption-burn
skills/video/caption-burn - compose-creator-layer
skills/video/compose-creator-layer - create-apple-notes-mockup
skills/video/create-apple-notes-mockup - create-chatgpt-mockup
skills/video/create-chatgpt-mockup - create-creator-takes-h3
skills/video/create-creator-takes-h3 - create-image-fal
skills/video/create-image-fal - create-image-gpt-image-fal
skills/video/create-image-gpt-image-fal - create-imessage-mockup
skills/video/create-imessage-mockup - create-kinetic-typography
skills/video/create-kinetic-typography - create-music-elevenlabs
skills/video/create-music-elevenlabs - create-video-fal
skills/video/create-video-fal - create-video-seedance-2-fal
skills/video/create-video-seedance-2-fal - create-vo-elevenlabs
skills/video/create-vo-elevenlabs - footage-cutlist
skills/video/footage-cutlist - media-proxy
skills/video/media-proxy - mix-master
skills/video/mix-master - render-3d-character-explainer
skills/video/render-3d-character-explainer - render-3d-product-showcase
skills/video/render-3d-product-showcase - render-absurdist-explainer
skills/video/render-absurdist-explainer - render-airdrop-carousel
skills/video/render-airdrop-carousel - render-brand-identity-reveal
skills/video/render-brand-identity-reveal - render-cartoon-music-video
skills/video/render-cartoon-music-video - render-cgi-sizzle
skills/video/render-cgi-sizzle - render-chatgpt-chat
skills/video/render-chatgpt-chat - render-cinematic-music-video
skills/video/render-cinematic-music-video - render-cosmic-mythology-voiceover
skills/video/render-cosmic-mythology-voiceover - render-creator-pip-listicle
skills/video/render-creator-pip-listicle - render-editorial-motion-podcast
skills/video/render-editorial-motion-podcast - render-flat-vector-explainer
skills/video/render-flat-vector-explainer - render-food-product-sizzle
skills/video/render-food-product-sizzle - render-glassy-matte-grwm
skills/video/render-glassy-matte-grwm - render-hand-swipe-flavor-listicle
skills/video/render-hand-swipe-flavor-listicle - render-hook-replacement
skills/video/render-hook-replacement - render-hypermotion
skills/video/render-hypermotion - render-ig-live-gallery
skills/video/render-ig-live-gallery - render-imessage-chat
skills/video/render-imessage-chat - render-ios-keyboard
skills/video/render-ios-keyboard - render-logo-equation-card
skills/video/render-logo-equation-card - render-model-comparison-grid
skills/video/render-model-comparison-grid - render-mosaic-grid-reveal
skills/video/render-mosaic-grid-reveal - render-multiworld
skills/video/render-multiworld - render-myth-vs-fact
skills/video/render-myth-vs-fact - render-narrated-ugc-wardrobe-stitch
skills/video/render-narrated-ugc-wardrobe-stitch - render-offer-ad
skills/video/render-offer-ad - render-podcast-skit
skills/video/render-podcast-skit - render-proof-points-overlay
skills/video/render-proof-points-overlay - render-song-mv
skills/video/render-song-mv - render-split-screen-creator
skills/video/render-split-screen-creator - render-stopmotion-hand-swatch-cycle
skills/video/render-stopmotion-hand-swatch-cycle - render-street-interview
skills/video/render-street-interview - render-value-prop
skills/video/render-value-prop - render-vignette
skills/video/render-vignette - render-vo-anchored-motion-listicle
skills/video/render-vo-anchored-motion-listicle - render-whiteboard-explainer
skills/video/render-whiteboard-explainer - review-finished-ad
skills/video/review-finished-ad - review-ugc-render
skills/video/review-ugc-render - stitch-videos-ffmpeg
skills/video/stitch-videos-ffmpeg - ugc-fixloop
skills/video/ugc-fixloop - verify-product-image
skills/video/verify-product-image - video-production-harness
skills/video/video-production-harness - watch
skills/video/watch - write-video-ad-script
skills/video/write-video-ad-script
How it works
<slug>
When your agent uses it
<What it does and when to use it, in one or two sentences. This is what an agent matches on. At most 1,024 characters.>
What it loads into context
Frontmatter
48 tokensAlways available to the agent
SKILL.md
151 tokensWhen the skill is activated
Reference documents
5,980 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Inputs
- Steps
- Done when
- Never
Scripts executed separately
../../scripts/build-router.js../../scripts/build-router.js../../scripts/build-router.js
Files
README.mddoc1,296 bytesSKILL.mdcore529 bytesskill.meta.jsonasset129 bytes../../scripts/build-router.jsruns3,722 bytes../../scripts/build-router.jsruns3,722 bytes../../scripts/build-router.jsruns3,722 bytes../../skills/entry/.claude-plugin/plugin.jsonasset564 bytes../../skills/entry/.codex-plugin/plugin.jsonasset627 bytes../../skills/entry/goose-ads/SKILL.mddoc3,435 bytes../../skills/entry/goose-ads/skill.meta.jsonasset147 bytes../../skills/entry/goose-product-photos/SKILL.mddoc2,816 bytes../../skills/entry/goose-product-photos/skill.meta.jsonasset171 bytes../../skills/entry/goose-video-local/SKILL.mddoc304 bytes../../skills/entry/goose-video-local/skill.meta.jsonasset158 bytes../../skills/entry/goose-video/SKILL.mddoc4,939 bytes../../skills/entry/goose-video/skill.meta.jsonasset149 bytes../../skills/entry/gooseworks/SKILL.mddoc7,499 bytes../../skills/entry/gooseworks/routes.jsonasset4,790 bytes../../skills/entry/gooseworks/routes.jsonasset4,790 bytes../../skills/entry/gooseworks/skill.meta.jsonasset201 bytes../../skills/entry/make-custom-video/SKILL.mddoc6,472 bytes../../skills/entry/make-custom-video/skill.meta.jsonasset526 bytes
Read SKILL.md
# <Title>
<One paragraph: what the skill makes or decides, and when to use it.>
## Inputs
- <What the agent needs first, and where it comes from.>
## Steps
1. <The first step, in plain words.>
2. <The next step.>
## Done whenView the complete source on GitHublearn-my-brand
When your agent uses it
Learn my brand once and stop asking me every time. Use when someone says learn my brand, set up my brand, here's our brand book, remember how we talk, what can we claim, can we say this, approve our claims, sign off our voice, our price or product changed, the client approved the claims, pick up where we left off, or check our claims are still current. Reads what GooseWorks already found about the brand, asks only the gaps as drafts to confirm, audits every claim (including ones research marked approved) and gets the ones that matter signed off with proof, scope and review date, turns the voice into rules the owner confirms, checks logo, colours and fonts, and saves it all as it goes so every other job loads it instead of asking. Ends with an unknowns list and a read-back. Not for who our customers are and what they say (use research-audience) or writing positioning from scratch (not covered yet).
What it loads into context
Frontmatter
217 tokensAlways available to the agent
SKILL.md
3,510 tokensWhen the skill is activated
Reference documents
27,270 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
SKILL.mdcore14,844 bytesSKILL.mdcore14,844 bytesSKILL.mdcore14,844 bytesatoms/brain-write-back/ATOM.mddoc6,968 bytesatoms/claims-audit/ATOM.mddoc3,988 bytesatoms/voice-calibrate/ATOM.mddoc3,148 bytesreferences/brain-map.mddoc10,434 bytesreferences/brand-record-template.mddoc6,386 bytesreferences/category-rules.mddoc9,748 bytesreferences/claims-craft.mddoc13,738 bytesreferences/intake-craft.mddoc8,031 bytesreferences/voice-craft.mddoc6,546 bytesskill.meta.jsonasset4,622 bytestests/test-by-hand.mddoc12,286 bytes../../../skills/marketing/claims-gate/SKILL.mddoc15,033 bytes../../../skills/marketing/save-learning/SKILL.mddoc9,842 bytes../../../skills/marketing/voice-card/SKILL.mddoc7,106 bytes
Read SKILL.md
# learn-my-brand
The front door. GooseWorks' server researches the brand and stores the kit; this playbook does what only the owner can: confirm what is true, decide what may be claimed, say how the brand sounds, and record what nobody knows yet. Every other playbook reads what it saves, through `../../../skills/marketing/claims-gate/SKILL.md` and `../../../skills/marketing/voice-card/SKILL.md`.
Talk to the owner about their brand, never about tools, ids, fields or other playbooks.
## What you get
- **A signed-off claims list:** each claim the brand may make, verbatim, with proof, scope (products, markets, channels), qualifier, review date and approver; every candidate not approved, with why, what would unlock it and a safe alternative; the never-say list tagged law / platform / owner.
- **A confirmed voice:** personality is/is-not, 3–5 rules with real do/don't pairs, banned words, terminology, how it flexes by channel and speaker.
- **Confirmed basics:** what we sell and the hero offer, who it is for, company type and stage, who approves, what buyers use instead, anything not to say in public.
- **An unknowns ledger:** each gap, what it blocks, the assumption in use, and when it will be asked.
- **All of it saved as it is confirmed**, plus a one-screen read-back the owner checks.
View the complete source on GitHubmake-product-photos
When your agent uses it
Use when the marketer says: studio photos of my product without a shoot, product photos for my store page, packshots on white, lifestyle or on-model shots, photos for the new colourway, fresh product imagery for ads, photos for our launch page, our packaging changed — redo the photos, I have no photographer. Delivers store-ready product photos generated from the brand's real product photos: a shot list built from the page slots (hero, alt angle, scale, detail, in use, lifestyle, on-model), only real photos of this product as references, matched to the brand's photography, every shot checked against the real product for shape, parts, logo, text, colour, finish, scale and honest representation, with a keep / maybe / reject verdict and a page order. The human picks the keepers. Never uploads to a store, never shows a size, part, feature or result the product lacks. Not for ads with text, infographics or screenshots — make-static-ads; not for marketplace listing sets (not covered yet).
What it loads into context
Frontmatter
225 tokensAlways available to the agent
SKILL.md
3,749 tokensWhen the skill is activated
Reference documents
18,676 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
SKILL.mdcore15,731 bytesatoms/fidelity-check/ATOM.mddoc2,460 bytesatoms/shot-list/ATOM.mddoc1,596 bytesatoms/source-audit/ATOM.mddoc4,270 bytesreferences/fidelity-rubric.mddoc6,271 bytesreferences/fit-and-honesty.mddoc5,921 bytesreferences/shot-list-and-surfaces.mddoc8,037 bytesskill.meta.jsonasset3,052 bytestests/test-by-hand.mddoc6,669 bytes../../../skills/marketing/claims-gate/SKILL.mddoc15,033 bytes../../../skills/marketing/honest-review/SKILL.mddoc3,611 bytes../../../skills/marketing/save-learning/SKILL.mddoc9,842 bytes../../../skills/marketing/save-to-brain/SKILL.mddoc6,868 bytes../../../skills/marketing/spend-gate/SKILL.mddoc6,102 bytes
Read SKILL.md
# make-product-photos
The engine composes, generates, judges and retries. This playbook is the e-commerce creative director around it: it decides which pictures the page needs, curates which real photos the engine sees, turns each shot into a precise prompt, holds every scene to what the product physically is, checks each output against the real product, and keeps the catalogue looking like one shoot.
## What you get
- A **shot list** from the surface (store page, ads, social, email, launch page), each shot with its slot, composition, light, scene and ratio — agreed before anything is made.
- A **house-style card** derived from the brand's existing photos (when they can be seen), confirmed once and saved.
- The **photo set** as the page it fills: each photo with its use, the engine's status and score, this playbook's verdict (keep / maybe / reject + named reason), and who checked it (by eye, or engine only with a checklist for you).
- "What we could not make and why", and the credits actually charged.
## Before you start
**Hard rules:**View the complete source on GitHubmake-video-ads
When your agent uses it
Use when the marketer says: make me a video ad, a 30-second ad for paid social, a Reel / TikTok / Shorts ad, a UGC-style video made with AI (no real creator), a product demo video, remake this ad I like for my brand, cut our best organic video into an ad, more like my winning video with new hooks, my video ad got rejected — fix it. Delivers a produced, ready-to-post video ad grounded in a researched angle: one message, a hook for the first two seconds, every claim traced to the brand's signed-off claims, no generated person posing as a customer, the exact words and the price approved before anything renders (one video, or one plus two hook variants), an honest review of the result, priced fixes only on a yes, and launch copy and notes for the ads team. Works in chat apps. Never publishes or spends ad budget. Not for real creators filming for you — work-with-creators (unsure? ask: AI-made or a real person); not for a phone-shot organic post — run-organic-social; not for static ads — make-static-ads.
What it loads into context
Frontmatter
247 tokensAlways available to the agent
SKILL.md
4,126 tokensWhen the skill is activated
Reference documents
23,899 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
SKILL.mdcore17,350 bytesSKILL.mdcore17,350 bytesSKILL.mdcore17,350 bytesatoms/present-gate/ATOM.mddoc3,040 bytesatoms/review-render/ATOM.mddoc2,482 bytesatoms/script-check/ATOM.mddoc2,896 bytesatoms/write-script/ATOM.mddoc2,908 bytesreferences/angles-formats-and-company-types.mddoc6,929 bytesreferences/claims-policy-and-people.mddoc7,963 bytesreferences/excellent-script-example.mddoc5,254 bytesreferences/paths-and-gates.mddoc5,862 bytesreferences/reading-the-brain.mddoc6,626 bytesreferences/review-rubric.mddoc5,764 bytesreferences/script-craft.mddoc5,289 bytesskill.meta.jsonasset4,392 bytestests/test-by-hand.mddoc8,629 bytes../../../skills/marketing/claims-gate/SKILL.mddoc15,033 bytes../../../skills/marketing/honest-review/SKILL.mddoc3,611 bytes../../../skills/marketing/save-learning/SKILL.mddoc9,842 bytes../../../skills/marketing/spend-gate/SKILL.mddoc6,102 bytes
Read SKILL.md
# make-video-ads
The video engine plans, prices, renders and checks files. This playbook is the creative director and scriptwriter around it: one researched angle, a hook in the buyer's words, every word and picture held to the signed-off claims, no generated person speaking as a customer, the human shown exactly what they pay for, and an honest review of the result.
## What you get
- A **finished video ad** for the primary placement, with its script, angle (and where it came from), the claims it uses and the credits spent against the price approved.
- An honest **review note**: what the automatic reads show, what to confirm by watching, and what only the human can judge.
- **Launch copy and launch notes** in `ads/videos/<project_id>.md` — one file per video — for run-paid-campaigns (the chosen, script-checked post copy; AI label to switch on; music to add in-platform; sibling hook variants).
- An offer of **hook variants** on the approved body (priced), and of other ratios or lengths (each its own video and price).
## Before you start
**Hard rules:**View the complete source on GitHubgoose-ads
When your agent uses it
Edit, resize, animate and study image ads with GooseWorks in this chat. New static or image ads go to the make-static-ads skill when it is installed or catalog_fetch opens it. Read the brand and follow the active playbook, preserving factual prerequisites and approvals.
What it loads into context
Frontmatter
82 tokensAlways available to the agent
SKILL.md
745 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules
Files
SKILL.mdcore3,435 bytesskill.meta.jsonasset147 bytes
Read SKILL.md
# GooseWorks ads
Use this entry for existing-ad operations and analysis. For new image ads, more ads, a winner's
variations, copy/font changes, a rejected ad fix or a requested social graphic, fetch
make-static-ads with catalog_fetch (or use the installed current package) and follow its
research, selection, claims and quote gates. If it cannot be fetched, report that creation
is unavailable on this connection and stop. The server generator is a different workflow,
not a fallback for the missing playbook.
- Save lasting human brand facts with the connection's listed knowledge action in their words.
- A batch on its way: job_get. Finished ads: ads_creative_read.
- One finished ad: an animation with ads_creative_animate (price it first, free, with
ads_creative_animation_quote), its tags or rating with ads_creative_update. A new size with
ads_creative_resize only when the customer asks: it spends credits and has no free priceView the complete source on GitHubgoose-product-photos
When your agent uses it
Make product photos (studio, lifestyle or on a model) of a brand's real products with GooseWorks in this chat. Start brand work with brand_knowledge_browse and follow the next_step in every answer.
What it loads into context
Frontmatter
72 tokensAlways available to the agent
SKILL.md
643 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules
Files
SKILL.mdcore2,816 bytesskill.meta.jsonasset171 bytes
Read SKILL.md
# GooseWorks product photos
Use GooseWorks to photograph the customer's physical products, here in this chat. A software
screen or an app is not a product photo.
- A fact the customer states about the brand (a price, a rule, their audience): save it with
brand_knowledge_save in their words, never in your own notes, and confirm in one line.
- Offer the brand's real products from brand_read; never describe one you can't see. A product
that isn't listed yet: brand_update adds it from its page. A photo the customer sends:
media_upload.
- photos_generate makes the photos: get its price first from the same call as a dry run (free,
it makes nothing), tell the customer the credit total, and make them only after their yes.
Show a person only when the customer asks for one and confirms they have the rights.
- Follow the photos with photos_read until they are ready.View the complete source on GitHubgoose-video
When your agent uses it
Make a video ad in this chat from a real reference ad, found or theirs; styles are the fallback. Follow every answer's next_step.
What it loads into context
Frontmatter
45 tokensAlways available to the agent
SKILL.md
1,076 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- A supplied video reference comes first
- Rules
Files
SKILL.mdcore4,939 bytesskill.meta.jsonasset149 bytes
Read SKILL.md
# GooseWorks video
Installed entry: catalog_fetch type skill goose-video on this connection and follow it. Already fetched this run: no repeat.
For a video already started, call video_read and follow its next_step.
New videos default to a real reference ad remade for the brand (custom); ready-made styles are the fallback. Start with get_started (wants video, request). Cards prove no pick or viewing.
1. The request. If they haven't said what the video is about, ask in one short question.
2. The brand. Ask which brand only when brand_read lists several; with one, use it.
3. The product. Before reference or style choices, ask which product or service to advertise, even with only one saved. Use the product card, or ask by name in chat, and wait. Only their stated choice settles it; a brand name does not. Reuse an explicit pick or request for none; find ids with brand_read, [] for none.
4. Research. Read the kit, learnings and selected products with brand_read, then knowledge_search. Verify product size and use from facts and size-reference photos before planning. Note what to say and avoid.
5. The reference. Their own video ad: video_create with style custom, request, products, its reference_url and a new UUID idempotency_key, then the custom rule. Otherwise, custom asked or not, video_references (action find) with the request and products ([] for none); free, and it reuses the saved list unless they want new ideas (fresh: true). Show it as the answer says; they pick.
6. The pick. video_references (action pick) with candidate_id, request, products and a new UUID idempotency_key starts the custom video. Then the custom rule.View the complete source on GitHubgoose-video-local
When your agent uses it
Make an approved GooseWorks video when an answer's next_step gives its command.
What it loads into context
Frontmatter
32 tokensAlways available to the agent
SKILL.md
71 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore304 bytesskill.meta.jsonasset158 bytes
Read SKILL.md
When an answer's next_step gives a command to make a video, its last line says who starts it and how: follow that line exactly, with the command exactly as given.View the complete source on GitHubgooseworks
When your agent uses it
GooseWorks growth coworker and router for markets, competitors, audiences, creators, campaigns, ads, photos, graphics, video, content, email, SEO, social, leads and contacts. Use for brand facts or copy too, so offers, prices, rules, audience and bestsellers reach the brand's Marketing Brain.
What it loads into context
Frontmatter
124 tokensAlways available to the agent
SKILL.md
1,760 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- First steps
- Skill routes
- Marketing playbooks
- Data work
- Rules
Files
SKILL.mdcore7,499 bytesroutes.jsonasset4,790 bytesskill.meta.jsonasset201 bytes
Read SKILL.md
# GooseWorks
Route specialist jobs to their skills; use GooseWorks for web and social data.
## First steps
1. Discover the listed setup/status action and read brand/task state. Complete missing facts;
preserve the selected brand/task and continue once setup is done.
2. Read brand_read and advertised knowledge actions for rules/evidence; pass results to the
playbook. Use legacy action names only when listed; ask only what remains ambiguous.
3. Save lasting human brand facts in their words through the listed typed knowledge action.
Keep guesses and temporary creative choices as proposals; follow claim, rights and approval
rules. Generic context is not approved product proof.
View the complete source on GitHubmake-custom-video
When your agent uses it
Create a custom video with sourced product accuracy, explicit sound routing and exact-final audiovisual review.
What it loads into context
Frontmatter
115 tokensAlways available to the agent
SKILL.md
1,323 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Non-negotiables
- Load and resume
- Reference, product and creative contract
- Save and review twice
- Produce, assemble and deliver
Files
SKILL.mdcore6,472 bytesSKILL.mdcore6,472 bytesskill.meta.jsonasset526 bytes
Read SKILL.md
# Human version
The owner approves script, then ingredients and budget here; cards and Studio are optional. Keep reference format, product and sound. GooseWorks checks the final.
---
# Agent version
## Non-negotiables
1. Watch every reference end to end with sound, or use the server's measured reference profile, and save the evidence before any script.
2. Write the script with write-video-ad-script (catalog_fetch it).
3. Keep the reference's format: people stay people, demos stay demos, sound type stays. Otherwise list the change in changes_from_reference.
4. The voice is the master clock. Never cut or retime sound apart from a talking face.View the complete source on GitHubad-policy-check
When your agent uses it
Checks paid ads against the ad platform's rules (Meta, TikTok, Google, LinkedIn and others) and the brand's category rules: the copy, on-image or on-screen text, pictures and people. Rewrites what can be fixed honestly, adds the disclosures that are needed, and flags anything that needs a human or legal review, with one pass, fixed or flag line per ad and platform. Use alone when you already have the ad text or images and know where they will run; otherwise run the playbook for the job (e.g. make-static-ads, make-content, email-lifecycle).
What it loads into context
Frontmatter
152 tokensAlways available to the agent
SKILL.md
1,607 tokensWhen the skill is activated
Reference documents
6,925 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Category first
- 2. Per ad, per platform
- 3. Disclosures on the asset
- 4. Fix honestly
- 5. Report
Files
SKILL.mdcore7,058 bytesdisclosure.mddoc3,120 bytesskill.meta.jsonasset538 bytes../claims-gate/SKILL.mddoc15,033 bytes../save-learning/SKILL.mddoc9,842 bytes
Read SKILL.md
# ad-policy-check
Used by: make-static-ads (paid ads) and run-paid-campaigns (creative it checks at launch). Organic, email and creator content: load `disclosure.md` instead (or as well, when a paid ad uses a creator).
Craft knowledge, not legal advice. Policies change: when a rule decides whether an ad ships, tell the human to confirm it on the platform's live policy page. Claims are a separate check (the `claims-gate` skill, `../claims-gate/SKILL.md`); run that first — a line cut there is not reworded here.
**Reads:** the ad's planned or rendered text (copy, on-image or on-screen words, end cards, captions), what the picture shows, the people in it, the platforms and placements from the brief, the brand's category, and the brand's `dont` / `must` learnings (past disapprovals).
**Writes:** one policy line per ad and platform, and any set-level flag.
## 1. Category first
Regulated (health, supplements, food with health, nutrition or free-from claims, cosmetics with efficacy language, alcohol, cannabis/CBD, tobacco/vape, financial products, crypto, weight loss, kids' products, regulated professions, gambling, dating, political) or a special ad category on Meta (housing, employment, credit, social issues)?
- No brand rule on file for it → flag the whole set "needs legal review before launch".View the complete source on GitHubanalyze-performance
When your agent uses it
Weekly performance read across every channel we run: what worked, why, and what to make next, judged on the business's real number (store revenue, qualified pipeline, retained users), not platform claims. Use when: write my Monday report; how are my ads doing — which ad won?; are my ads actually making money (Meta says 4x ROAS but revenue is flat); why did sales drop this week; did the test win; is my tracking working; monthly numbers for the replan; anything on fire today. Not for acting on the recommendations (pausing, scaling, launching) — use run-paid-campaigns; not for replanning the budget — use plan-campaign.
What it loads into context
Frontmatter
172 tokensAlways available to the agent
SKILL.md
3,591 tokensWhen the skill is activated
Reference documents
36,237 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
../analyze-performance-call-and-learn/SKILL.mddoc2,421 bytes../analyze-performance-diagnose/SKILL.mddoc1,606 bytes../analyze-performance-intake/SKILL.mddoc1,935 bytes../analyze-performance-rank-and-read/SKILL.mddoc1,833 bytes../analyze-performance-revenue-join/SKILL.mddoc1,520 bytesSKILL.mdcore15,310 bytesreferences/creative-and-channels.mddoc7,190 bytesreferences/diagnosis.mddoc5,626 bytesreferences/local-mode.mddoc2,106 bytesreferences/measurement-contract.mddoc10,496 bytesreferences/monday-report.mddoc9,085 bytesreferences/monthly-and-pulse.mddoc4,539 bytesreferences/revenue-join.mddoc4,667 bytesreferences/run-memory.mddoc15,035 bytesreferences/tests-and-learnings.mddoc5,642 bytesskill.meta.jsonasset6,034 bytestests/test-by-hand.mddoc7,092 bytes../marketing-guide/SKILL.mddoc17,316 bytes../run-memory/SKILL.mddoc18,060 bytes../save-learning/SKILL.mddoc9,842 bytes../save-to-brain/SKILL.mddoc6,868 bytes../spend-gate/SKILL.mddoc6,102 bytes../write-report/SKILL.mddoc8,986 bytes
Read SKILL.md
# analyze-performance
## What you get
- **The Monday report** — saved to `reports/performance/<YYYY-MM-DD>.md` and shown in chat, the same shape every week (`references/monday-report.md`); run-paid-campaigns decides and acts on its recommendations.
- **Learnings** written to the brand brain after the marketer has seen and kept them; ended tests' measured results saved as readouts.
- **A run record** for next week (`references/run-memory.md`): the per-channel and per-ad scorecards with the trend since last run, each call with its owner, review date and test, and what happened to last week's calls — saved to the brand, so "what worked" and "what to make next" rest on weeks of history, not one week.
- **Monthly unit-economics read** for plan-campaign's replan; **daily pulse** on request, exception-only (`references/monthly-and-pulse.md`).
## Before you start
1. **Setup first:** do the `marketing-guide` skill (`../marketing-guide/SKILL.md`) §1–2 (connect, brand, brain read) before anything else; the job line is "read your results". This playbook offers **local mode** (marketing-guide §5): with no GooseWorks it reads through the marketer's connectors, else exports and screenshots, and keeps the contract, reports and run records in the local folder. A missing connection is never a blocker: say in one line what this read can and can't see, and go on.
2. **Read the brain and the plan** (free; local mode: `references/local-mode.md` instead). Brain chapters: 18 "How we count results", 20 "Our plan" (targets, decisions, experiments), 22 "Everything we have made and run", 23 "What is working" (readouts, worn-out angles, lessons). Fallback path: `brand_read` sections `summary, kit, products, learnings, onboarding, accounts`, and `knowledge_search` `["learning"]` for past results. Then `gooseworks:campaign_read` — live briefs (Economics, targets, Test plan, Measurement plan, Replan triggers, the change-log slug in Status); workspace (`gooseworks:file_list` / `file_read`): `reports/performance/definitions.md`, the latest dated report and its Decisions, `ads/campaigns/<slug>/state.md` (frontmatter `meta_push_ids`, health line, open recommendations) and the `### YYYY-MM-DD — <title>` blocks of `decisions.md` (what was actually done — written by run-paid-campaigns and the server), make-static-ads' batch files `ads/batches/<YYYY-MM-DD>-<slug>.md` (creative id → angle, hook, test; picks), `lifecycle/program.md` (which flows exist), the newest `research/competitors/watch/<YYYY-MM-DD>.md` (line 2), and research-market's "What people are saying" section — in the newest `research/market/<D>-read.md` (mentions, sentiment, trends, risks; check the section's own window line before treating it as this week's, and read share of voice only if it is there).
3. **Load the last runs** — the Start steps of the `run-memory` skill (`../run-memory/SKILL.md`) for this job (`weekly performance read`, `monthly read` or `daily pulse`; `references/run-memory.md`): the last record, plus up to four weekly records back for the scorecards and angle history; every earlier call checked against a source; run-paid-campaigns' newest run record for each campaign (its money moves and verdicts). No record → say it's the first read; this run's numbers become the baseline.View the complete source on GitHubanalyze-performance-call-and-learn
When your agent uses it
Step of the analyze-performance playbook: calls ended tests, scores last week's calls, writes this week's kill/scale/hold calls and drafts learnings for the brand brain. Run analyze-performance instead; not for direct use.
What it loads into context
Frontmatter
71 tokensAlways available to the agent
SKILL.md
566 tokensWhen the skill is activated
Reference documents
7,555 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore2,421 bytesskill.meta.jsonasset422 bytes../analyze-performance/references/run-memory.mddoc15,035 bytes../analyze-performance/references/tests-and-learnings.mddoc5,642 bytes../save-learning/SKILL.mddoc9,842 bytes
Read SKILL.md
# Test calls, calls and learnings (atom)
**Load:** `../analyze-performance/references/tests-and-learnings.md`.
**Inputs:** the brief's test plan; this week's results; last week's report (its calls); the change log (what was actually done); the learnings and readouts (`brand_knowledge_browse` kind 23 / `brand_knowledge_search` where listed; else `knowledge_search source_types: ["learning"]`, `brand_read` learnings); the paid run's newest run record.
**Do:**
1. Call each ended test Win / Loss / Unclear against its written criteria with the brief's action; state how sure (confirmed / likely / first look).
2. Score last week's recommendations through run-memory's outcome check (`../analyze-performance/references/run-memory.md`): what was actually done (the `### YYYY-MM-DD — <title>` blocks in `decisions.md`, run-paid-campaigns' run record), and what happened — for a money move, the paid run's verdict plus the store-joined check over the same window; right or wrong.
3. Write this week's calls (kill / scale / hold, Google negatives) with object, why, how sure and "would change if"; first look → "watch".
4. Check fired replan triggers against the brief's thresholds.
5. Draft ≤ 3 learnings as one-line rules (template in the reference); only ended tests, 2+ week patterns that clear the test n floors on the referee-joined number, confirmed surprises or failures; each shows what it would retire.
6. Readouts: each Win / Loss → kind 23 `experiment_readout.<campaign-slug>-t<n>` through save-learning's readout path, only with the marketer present; scheduled runs mark it `readout to save`.
7. After the marketer's reply to the decisions block: write the kept learnings through the `save-learning` skill (`../save-learning/SKILL.md`) — one idea per learning, `[learning YYYY-MM-DD]` (+ ` A-NN`), their exact words as the statement, own superseded facts retired in the same call; read back, compare, report which landed. Without their words, write nothing.View the complete source on GitHubanalyze-performance-diagnose
When your agent uses it
Step of the analyze-performance playbook: flags tracking breaks with fixes and explains each big metric move with evidence, confidence and ruled-out causes. Run analyze-performance instead; not for direct use.
What it loads into context
Frontmatter
63 tokensAlways available to the agent
SKILL.md
363 tokensWhen the skill is activated
Reference documents
1,306 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore1,606 bytesskill.meta.jsonasset245 bytes../analyze-performance/references/diagnosis.mddoc5,626 bytes
Read SKILL.md
# Plumbing and the why (atom)
**Load:** `../analyze-performance/references/diagnosis.md`.
**Inputs:** the clean dataset; the overclaim ratio and its trend; the change log (`decisions.md`); push failures/disapprovals reported by run-paid-campaigns or the marketer; the competitor watch digest; research-market's "What people are saying" section (newest `research/market/<D>-read.md`; check its window); the promo calendar and stock notes from the brief; destination URLs of top ads.
**Do:**
1. Plumbing: test each break signature (ratio jump/collapse, zero-conversion days with spend, ROAS spike with flat orders, LPV/click drop, UTM traffic missing). For each break: symptom, likely location, what to check, the fix when identifiable, what it blocks. Mark affected numbers suspect.
2. For each metric that moved materially at equal maturity: read the change log, check noise, mix shift, breakdown effect and denominator changes, then walk the cause checklist in order. One piece of evidence per named cause; confidence; ruled-out and unconfirmed causes listed.
3. Page/message match for the top 2–3 winners and losers (open the page if the host can browse; else ask for a screenshot): product, promise, offer, price, stock.
**Output:** the report's Plumbing and Why-it-moved sections, and mismatches to note.View the complete source on GitHubanalyze-performance-intake
When your agent uses it
Step of the analyze-performance playbook: gathers the week's numbers from tools, exports and pastes, cleans them, and writes the coverage line or switches to claims-only mode. Run analyze-performance instead; not for direct use.
What it loads into context
Frontmatter
68 tokensAlways available to the agent
SKILL.md
439 tokensWhen the skill is activated
Reference documents
2,410 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore1,935 bytesskill.meta.jsonasset243 bytes../analyze-performance/references/measurement-contract.mddoc10,496 bytes
Read SKILL.md
# Intake, hygiene and coverage (atom)
**Load:** `../analyze-performance/references/measurement-contract.md`.
**Inputs:** the measurement contract (company type, referee, channel roster); tool reads (`meta_read performance`, `social_analytics_get`, `ads_creative_read`, `video_read`, `campaign_read`); the marketer's connectors / exports / screenshots / pastes from the one input message.
**Do:**
1. Start from the minimum useful read (contract §4) and tick the rest against the roster; big pasted exports are totalled in code when a code tool exists; with none, never totalled by eye — ask for the summary report and mark the referee not measured until it arrives (contract §4); never echoed. Then: what arrived, what didn't ("not checked this week" — no mid-run asks).
2. Hygiene: strip test, wholesale, staff orders and subscription renewals from new revenue; net refunds; align timezone and currency; note discount depth.
3. Maturity: compare this week as first reported with last week as first reported; show last week restated separately. Exports are the week's source; `meta_read` identifies Goose ads and cross-checks — de-duplicate by ad id.
3b. Save the input summary to `reports/performance/inputs/<YYYY-MM-DD>.md` for run-paid-campaigns to reuse.
4. Coverage line: per channel — truth / claimed / not measured / not used; share of Meta spend seen in detail.
5. The type's referee missing (or no total spend) → claims-only mode (labels, no MER, calls capped at first look, first-line notice).
View the complete source on GitHubanalyze-performance-rank-and-read
When your agent uses it
Step of the analyze-performance playbook: ranks creative by angle, hook and format with spend gates, writes short per-channel reads and drafts what to make next. Run analyze-performance instead; not for direct use.
What it loads into context
Frontmatter
67 tokensAlways available to the agent
SKILL.md
430 tokensWhen the skill is activated
Reference documents
5,447 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore1,833 bytesskill.meta.jsonasset250 bytes../analyze-performance/references/creative-and-channels.mddoc7,190 bytes../analyze-performance/references/run-memory.mddoc15,035 bytes
Read SKILL.md
# Creative ranking and channel reads (atom)
**Load:** `../analyze-performance/references/creative-and-channels.md`.
**Inputs:** `meta_read performance` (ranked by spend; the scorecard on the settled `days: 14` minus `days: 3` window, 7- and 28-day reads for the fatigue trend); each Goose ad's angle annotation (`ads_creative_read` and the campaign concepts); the non-Goose export; UTM store conversion per angle; email export; `social_analytics_get` posts and accounts; Google export and search terms; app/local exports.
**Do:**
1. Creative: group by angle → hook → format; rank by spend; apply minimum-spend gates; verdict with confidence; fatigue trend; name no winner if `insight.available` is false; state coverage.
2. Build the per-channel and per-ad scorecards against last run's rows and the angle history line (`../analyze-performance/references/run-memory.md`).
3. Draft "what to make next" from the history: tiring 2+-run winners first, retire losers, fair test for too-early, organic overperformers as paid candidates; nothing that already failed without a new reason; unmade items carried with their first date — producer and date for each.
4. Email & SMS, organic, Google (+ wasted-spend terms), apps, local: one short block each, or "not measured this week" / "not used".
5. Future rows: creators (codes), outreach (reply rates), WhatsApp — named, never dropped.
**Output:** the scorecards for the run record; the report's Creative ranking, channel blocks, channel-table rows and What-to-make-next draft.View the complete source on GitHubanalyze-performance-revenue-join
When your agent uses it
Step of the analyze-performance playbook: joins cleaned store or CRM numbers with ad spend to build the business-truth table, MER, new-customer cost and the overclaim ratio. Run analyze-performance instead; not for direct use.
What it loads into context
Frontmatter
73 tokensAlways available to the agent
SKILL.md
352 tokensWhen the skill is activated
Reference documents
1,135 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore1,520 bytesskill.meta.jsonasset249 bytes../analyze-performance/references/revenue-join.mddoc4,667 bytes
Read SKILL.md
# Revenue join (atom)
**Load:** `../analyze-performance/references/revenue-join.md`.
**Inputs:** clean store/CRM numbers; total spend per platform; platform claims; break-even MER and allowable CAC (campaign brief economics box / measurement contract); last week's report (the story the marketer picked).
**Do:**
1. Business-truth table: this week, last week, 4-week average, same week last year.
2. MER, new-customer MER, nCAC, contribution after ads — each vs break-even / allowable / target.
3. Overclaim ratio, like-for-like as in the reference (claimed purchases ÷ store orders, or claimed revenue ÷ store gross; a floor when a claimant is missing), with its 4-week trend.
4. Marginal: Δ new-customer revenue ÷ Δ spend vs last week and vs the 4-week average.
5. If the platform and blended stories point different ways: write both at the same grain, each ending "if true, you'd…", a recommendation, and the cheapest test that would settle it. Carry forward the story the marketer picked last time unless a test changed it.
6. B2B: pipeline chain and cost per qualified lead / opportunity instead of revenue.
View the complete source on GitHubclaims-gate
When your agent uses it
Checks every claim in a piece of copy (ads, emails, posts, pages, scripts, briefs) against the claims the brand has approved. Keeps, rewrites or cuts each line, and lists the proof that would bring a cut line back. When a line the copy needs has no approval, it asks for a short sign-off on the 3 or 4 lines that matter and records the answer. Use alone when you already have the copy and a brand set up; otherwise run the playbook for the job (e.g. make-static-ads, make-content, write-outreach).
What it loads into context
Frontmatter
148 tokensAlways available to the agent
SKILL.md
3,704 tokensWhen the skill is activated
Reference documents
11,549 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Load the contract (once per job)
- 2. Check the spans
- 3. Act and report
- 4. Scoped sign-off (when the job needs lines nobody has approved)
- 5. Recording an approval (the exact contract)
Files
SKILL.mdcore15,033 bytesclaim-types.mddoc3,334 byteslocal-claims.mddoc6,854 bytesrecord-skeleton.mddoc1,487 bytesskill.meta.jsonasset690 bytes../marketing-guide/SKILL.mddoc17,316 bytes../save-learning/SKILL.mddoc9,842 bytes../save-to-brain/SKILL.mddoc6,868 bytes
Read SKILL.md
# claims-gate
One contract for every playbook that writes copy, scripts, briefs, emails, posts, pages or captions. Only this atom ever writes a claim as approved; claims and markers already in the brand (from the GooseWorks app or an earlier brand pass) are read the same way. The calling playbook keeps its own extract step (on-image text, video scenes, page sections) and hands this atom the spans.
Say it to the human in plain words ("two lines need your OK before I use them"), never as tool, fact or playbook names.
## 1. Load the contract (once per job)
**Which path.** Use the **older path** (steps 1–2: the marker and its `Claims you may use —` facts) on every server today, including ones that list `brand_knowledge_*` tools: approvals customers already gave live there, and a chat sign-off recorded by §5 is usable at once. Also count a brain claim a person confirmed (step 5). Where the two disagree, the stricter wins. Steps 3, 4, 6, 7 and 8 always apply. (The **brain path**, where only brain-confirmed claims count and a chat yes waits for the app, §4.6, applies once the brand's server says chat approvals are recorded only in the app.)
**Local mode** (no GooseWorks, [the `marketing-guide` skill](../marketing-guide/SKILL.md) §5): the contract is `gooseworks-local/<brand-slug>/claims.md`, read and written by [`local-claims.md`](local-claims.md) (next to this file) in place of steps 1–3 and 5. Only a row whose newest status is `approved` and that passes its checks (scope, date, the approver's own words, proof reopened) is usable; declined, pending and retired rows never are. The `dont`s and `must`s come from `brand-notes.md`. §2–4 run as written, with `local-claims.md` for who approves and the record.
1. `gooseworks:brand_read` `sections: ["learnings"]` (lean is enough: it returns every `must` and `dont`).
2. **Older path:** find the **marker**: a `must` fact starting `Claims sign-off (learn-my-brand,` (a fixed format: the opening names its first writer and stays as it is). Read its status token and match it exactly:View the complete source on GitHubemail-lifecycle
When your agent uses it
Lifecycle email, SMS and push: audits the list and deliverability, then writes the flows this kind of business needs first, loadable as-is in your own tool, plus segments, cadence and this week's broadcasts. Never sends anything. Use when: set up my welcome and abandoned-cart emails; trial onboarding or waitlist launch emails; win back lapsed customers; plan this week's emails and texts; push notifications for my app; why are my emails going to spam; plan our Black Friday email and SMS sends; a send went wrong. Not for cold outreach to prospects — use write-outreach; not the editorial newsletter issue — use make-content; not the whole cross-channel Black Friday plan — use plan-campaign.
What it loads into context
Frontmatter
176 tokensAlways available to the agent
SKILL.md
4,094 tokensWhen the skill is activated
Reference documents
45,138 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
../ad-policy-check/disclosure.mddoc3,120 bytes../claims-gate/SKILL.mddoc15,033 bytes../email-lifecycle-broadcast-planner/SKILL.mddoc2,361 bytes../email-lifecycle-flow-writer/SKILL.mddoc4,236 bytes../email-lifecycle-lifecycle-audit/SKILL.mddoc4,551 bytes../email-lifecycle-offer-math/SKILL.mddoc2,371 bytes../email-lifecycle-send-check/SKILL.mddoc3,777 bytesSKILL.mdcore18,035 bytesreferences/benchmarks.mddoc1,902 bytesreferences/copy-craft.mddoc3,615 bytesreferences/deliverability.mddoc5,877 bytesreferences/flow-library.mddoc14,418 bytesreferences/intake.mddoc6,700 bytesreferences/loadable-flow-format.mddoc8,407 bytesreferences/modes-and-incidents.mddoc5,615 bytesreferences/run-memory.mddoc9,124 bytesreferences/segments-cadence-offers.mddoc5,258 bytesreferences/sms-push-whatsapp.mddoc3,146 bytesreferences/worked-flows.mddoc9,075 bytesskill.meta.jsonasset5,562 bytestests/test-by-hand.mddoc9,269 bytes../marketing-guide/SKILL.mddoc17,316 bytes../run-memory/SKILL.mddoc18,060 bytes../save-learning/SKILL.mddoc9,842 bytes../save-to-brain/SKILL.mddoc6,868 bytes../voice-card/SKILL.mddoc7,106 bytes../write-report/SKILL.mddoc8,986 bytes
Read SKILL.md
# email-lifecycle
One marketer want: "Cart and welcome emails make money while I sleep — mine do not exist." The playbook drafts and stages a lifecycle program; the marketer loads it into their own tool and presses send.
## What you get
1. **Deliverability and list report** — every plumbing item green / red / unknown, each marked *verified* (the agent saw it), *from you* or *unknown*. Never a green the agent did not see. Red and unknown items come with the exact fix and who does it.
2. **Flow pack** — the flows you asked for, or else the top two this business can load today (a third is offered), each a build sheet in your tool's own terms: trigger, filters, exit, re-entry, consent per market, priority and suppressions, timing, and every message finished, plus its goal metric, its test, a holdout where one fits, and the result it should beat. Each flow is marked **ready to load** or **not ready**, with the blocker in plain words ("waiting on your answer about returns", "needs your app to tell the email tool who installed", "your current plan can't run this — here are the options").
3. **Segments, priority and cadence** — segment definitions in the company's own terms (clicks, orders, activity — not opens), the flow priority map and frequency cap, the proposed send cadence.
4. **This week's broadcasts and the month's calendar** — broadcasts finished and ready to schedule (email; SMS only where consent exists and the moment is high-intent); the calendar as one table of dates and ideas.
5. **Proposals awaiting a yes** — offer depth with margin math, cadence, sunset slice, tool or plan changes, a tracking plan for missing events, any high-stakes send.
## Before you start
View the complete source on GitHubemail-lifecycle-broadcast-planner
When your agent uses it
Step of the email-lifecycle playbook: builds the month's send calendar and writes this week's email and SMS broadcasts against the approved cadence and segments. Run email-lifecycle instead; not for direct use.
What it loads into context
Frontmatter
67 tokensAlways available to the agent
SKILL.md
547 tokensWhen the skill is activated
Reference documents
4,073 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore2,361 bytesskill.meta.jsonasset248 bytes../email-lifecycle/references/copy-craft.mddoc3,615 bytes../email-lifecycle/references/modes-and-incidents.mddoc5,615 bytes../email-lifecycle/references/segments-cadence-offers.mddoc5,258 bytes../email-lifecycle/references/sms-push-whatsapp.mddoc3,146 bytes
Read SKILL.md
# broadcast-planner
**Reads:** make-content's next newsletter issue if any; `../email-lifecycle/references/segments-cadence-offers.md`, `../email-lifecycle/references/copy-craft.md`, `../email-lifecycle/references/sms-push-whatsapp.md`, `../email-lifecycle/references/modes-and-incidents.md` (seasonal); the approved cadence and segments from `lifecycle/program.md`; the brand's promotional calendar and launch dates (brain or asked); campaign records with an email/SMS leg via `gooseworks:campaign_read`; last week's results from the latest `reports/performance/*.md`; stock for every product it will feature (asked if the brain does not hold it).
**Does:**
1. **The month's calendar.** One row per planned send: date, segment, type (value / promotional / launch / newsletter), the one idea, offer if any (from the ladder only), channel. Campaign moments come from plan-campaign's brief; the rest are filled to the approved cadence with roughly 60–70% useful sends in non-sale weeks; a pull-back week after any tentpole. Flags blackout dates and shipping cut-offs. Totals the month's sends (sequences built as broadcasts + broadcasts + newsletter, after exits) against the plan's monthly send limit; spreads the sends or proposes the upgrade.
2. **This week's sends, finished.** Per send: segment and exclusions (recent purchasers, people mid-checkout flow, unengaged), send time and time-zone basis, subject + 2 alternates, preview, body, CTA with tracked URL, plain text, the test (subject, send time or offer; winner on clicks or orders; test slice size), stock confirmed for each featured product. Newsletter: slot make-content's issue (`content/newsletter/<date>.md`) with segment, send time and exclusions; this atom does not write the issue.
3. **SMS** only for high-intent moments with SMS consent, with brand name, STOP language, quiet hours, segment count.
4. **Margin box** from offer-math beside every discount.
**Writes:** `lifecycle/calendar/<YYYY-MM>.md` and `lifecycle/broadcasts/<YYYY-MM-DD>.md` (week starting date), plus the same in chat.View the complete source on GitHubemail-lifecycle-flow-writer
When your agent uses it
Step of the email-lifecycle playbook: writes one lifecycle flow as a build sheet for the brand's email tool, every message finished in the brand voice. Run email-lifecycle instead; not for direct use.
What it loads into context
Frontmatter
69 tokensAlways available to the agent
SKILL.md
1,005 tokensWhen the skill is activated
Reference documents
9,328 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore4,236 bytesskill.meta.jsonasset242 bytes../email-lifecycle/references/copy-craft.mddoc3,615 bytes../email-lifecycle/references/flow-library.mddoc14,418 bytes../email-lifecycle/references/loadable-flow-format.mddoc8,407 bytes../email-lifecycle/references/sms-push-whatsapp.mddoc3,146 bytes../email-lifecycle/references/worked-flows.mddoc9,075 bytes
Read SKILL.md
# flow-writer
**Reads:** the flow's entry in `../email-lifecycle/references/flow-library.md`; `../email-lifecycle/references/loadable-flow-format.md`; `../email-lifecycle/references/copy-craft.md`; `../email-lifecycle/references/worked-flows.md` (quality bar); `../email-lifecycle/references/sms-push-whatsapp.md` when the flow has those legs. From the brain: voice, banned words, signed-off claims, product records (price, offers, notes), learnings. From the program sheet: tool and plan, segments, priority map, cap, consent per channel. The standing offer from the shared `Standing offer:` fact. From the audit: the live flow this replaces, if any.
**Does:**
1. **Wire it first, in the tool's real syntax** (`loadable-flow-format.md`; when unsure of a tag, name the editor action instead of guessing). Check plan reality: no workflows → a fixed-date sequence becomes scheduled broadcasts with an exclusion list and the sign-up welcome becomes the form's autoresponder, written in the tool's terms (not tool-neutral); only a flow the plan cannot run even that way is said and written tool-neutral. Fill the flow header completely in the tool's own vocabulary: exact trigger name, trigger and flow filters, exit, re-entry, consent, smart sending, quiet hours, priority and suppressions, cap, UTM template, discount object (from offer-math), holdout, A/B test (winner on clicks or orders), build notes. A feature the plan lacks gets its workaround.
2. **Plan the messages.** Count and delays from the library, adjusted to this brand's price and cycle (say why if moved). Write one job per message before any copy. Check the sequence reads as a story, not five versions of the same email.
3. **Write each message finished.** Subject + 2 alternates, preview, from and reply-to, body blocks, one CTA with full URL, merge tags with fallbacks, dynamic blocks with out-of-stock behaviour, splits with a default branch, image needs with alt text (optional art requests as a line: `Graphic needed: for make-static-ads · header art: <flow, message, size, what it shows, alt text> · return to: lifecycle/flows/<flow-slug>.md`), a full plain-text version, footer, and the claim id or record behind each factual sentence. Vary length and shape across the flow. For B2B and services default to plain text from a named person.
4. **Self-check against `copy-craft.md` failure list.** Rewrite any hit.
5. **Leave honest gaps.** Anything the brain and the marketer have not settled stays a visible [placeholder] with its question at the top of the flow file, and the flow's status line reads `not ready: answer Q3, Q5`. A flow written against tracking-plan events reads `not ready: needs events E1–E3 live`; one the plan can't run even with that workaround reads `not ready: needs tool decision T1`. Only a flow with no open blocker is `ready to load` (with `· switch on after fix #N` while authentication is red or unknown); a header-art request never blocks it. Never invent a fact, an offer, a review, a count or an existing event name; events that do not exist yet go into the tracking plan (event, properties, when it fires, which flow) labelled "proposed — confirm with engineering", and the flow is written against those names.
6. **Hypothesis for this cycle.** One line per flow: what it should do and against which number (e.g. "abandoned checkout: ≥ 4% of recipients order within 7 days; baseline unknown"), the goal metric and when it will be read. Saved into `lifecycle/program.md` for the next run's read-back.
7. **Art answers.** On a re-run, read any `Graphic ready:` line under this flow's header-art `Graphic needed:` request and place the image.
View the complete source on GitHubemail-lifecycle-lifecycle-audit
When your agent uses it
Step of the email-lifecycle playbook: audits list, consent, live flows, recent sends and sending setup, marking every item verified, from-you or unknown. Run email-lifecycle instead; not for direct use.
What it loads into context
Frontmatter
71 tokensAlways available to the agent
SKILL.md
1,047 tokensWhen the skill is activated
Reference documents
4,052 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore4,551 bytesSKILL.mdcore4,551 bytesskill.meta.jsonasset246 bytes../email-lifecycle/references/benchmarks.mddoc1,902 bytes../email-lifecycle/references/deliverability.mddoc5,877 bytes../email-lifecycle/references/run-memory.mddoc9,124 bytes
Read SKILL.md
# lifecycle-audit
**Reads:** the optional audit items from intake message 1 (flows list, 90-day campaign report, list size, the "original" text of one recent campaign, the spam-rate chart — it asks nothing separately); `lifecycle/program.md` and the latest `lifecycle/deliverability/*.md` if present; the latest `reports/performance/*.md`; whatever the marketer handed over (tool exports, screenshots, Postmaster chart); the customer's own email-tool connector if the host has one (read only). Loads `../email-lifecycle/references/deliverability.md` and `../email-lifecycle/references/benchmarks.md`.
**Does:**
1. **Plumbing.** For each checklist item in `deliverability.md`, collect evidence. Authentication is green only from a marketing test email's headers (sent through the email tool) showing `spf=pass`, `dkim=pass` aligned with the From domain, and `dmarc=pass` — SPF on the tool's own return-path is fine (Mailchimp, and HubSpot without a dedicated IP, can't align SPF; that is not a fix item). Check the headers came through the email tool (its Return-Path or DKIM signature, a List-Unsubscribe header) — a personal Gmail or Workspace email's headers don't count and stay unknown; with a shell, `dig TXT` supports it (return-path domain, `_dmarc`, DKIM selector). A root-domain record alone is "present — not verified for marketing mail". Mark every item verified / from you / unknown. Never mark unknown items green.
2. **List.** Size; engaged-30/90 counts and share (clicks and orders, not opens); growth and churn in the last 30 days; consent source per channel; any bought, scraped or marketplace-sourced segment (hard stop for those contacts); last send date (6+ months dormant → re-permission first).
3. **Flows live** — in the email tool and in the store platform (Shopify's default abandoned-checkout email, Shopify Email automations, review-app request emails such as Judge.me or Okendo), so the build order can switch off duplicates. Name, trigger, status, message count, the last 90 days' recipients, conversion or revenue per recipient. Look for the classic breaks: buyers still receiving cart emails (no "placed order since" filter), overlapping flows with no priority, dead or expired codes, links to removed products, missing fallbacks.
4. **Read-back against last cycle.** For each flow in `lifecycle/program.md`, compare its recorded hypothesis and target — and the last run record's numbers for it (`../email-lifecycle/references/run-memory.md`: same window length, same attribution setting, settled, never opens) — with this cycle's result (the weekly read's email rows or the marketer's export): beat it → keep, promote the winning test; missed it → its weakest message is first in line to rewrite; no data → "not measured". Write each flow's result and next hypothesis into the state block for step 2's ranking.
5. **Recent sends (90 days).** Cadence by segment, revenue or conversion per recipient, unsubscribes, complaints, bounces; the worst three sends and why.
6. **Verdict.** GREEN / AMBER / RED with the blockers first. Only missing consent or complaints ≥ 0.3% stop the writing. Red or unknown authentication blocks switching on and broadcasts, not drafting: flows are still written, marked "switch on after fix #N", and unknown items go on the marketer's fix list. Bulk-sender rules are requirements at ≈ 5,000+ a day to Gmail/Outlook (a list above ~5,000 with unknown Gmail share is treated as bulk); below that, amber best practice. If the list's main market is one where people buy over chat (India, Southeast Asia, Brazil, much of Latin America), the first line says WhatsApp is likely the main channel and is not covered yet.
**Writes:** the report in the format at the end of `deliverability.md`, shown to the marketer before any writing, and saved later as `lifecycle/deliverability/<YYYY-MM-DD>.md`. A short "state of the program" block (list, flows live with last cycle's result vs target, what is broken, what is missing) feeds the flow choice. In chat, the report names no tools or ids — "your sending isn't verified yet: here's the one setting to change".
View the complete source on GitHubemail-lifecycle-offer-math
When your agent uses it
Prices one discount, free-shipping threshold or referral reward against contribution margin: cost per order, share of margin used, break-even lift, code leakage risks, and one recommended offer in two plain sentences. Use alone when you already have the offer, average order value and margin per product; otherwise run email-lifecycle.
What it loads into context
Frontmatter
93 tokensAlways available to the agent
SKILL.md
526 tokensWhen the skill is activated
Reference documents
1,285 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore2,371 bytesskill.meta.jsonasset265 bytes../email-lifecycle/references/segments-cadence-offers.mddoc5,258 bytes
Read SKILL.md
# offer-math
**Reads:** `../email-lifecycle/references/segments-cadence-offers.md` (ladder and formula); AOV and margin per product or category from `lifecycle/program.md` (marketer-stated); the standing first-order offer from the shared `Standing offer:` fact (else the Brand record's business facts, read with `file_read`; never a search snippet); product records for price.
**Does:**
1. **Check the offer is allowed:** the standing offer, or a step of a ladder the marketer approved. Welcome never deeper than the standing offer; first cart reminder never discounted; no discount to returning full-price buyers in cart flows; no code twice in 30 days. Anything else is a proposal, not a draft.
2. **Compute** contribution per order, discount cost per order, share of contribution used, and the break-even lift, with the inputs shown. Free shipping: cost = average shipping cost × share of orders newly qualifying. Rewards (referral): cost per successful referral both sides vs contribution of the referred first order. Subscriptions and apps: use the subscription formula in the reference (store fee, months retained).
3. **Leakage:** shared vs unique code (if the sign-up form shows a shared code, repeat that code and flag the leakage as a proposal naming the popup edit — never switch it silently), stacking, exclusions, expiry, which segments see it (are full-price buyers in them?).
4. **Recommend one** — usually the cheapest offer that does the job, or a non-discount value (free shipping, gift with purchase, early access) — in two plain sentences.
5. **Unknown margin:** show cost per order in money, say "margin unknown", and do not call it affordable.
**Writes:** an offer box placed next to the flow or send that uses it, and into the "awaiting your yes" list. The approved depth is saved in `lifecycle/program.md`; the approved depth stays in the program sheet (a standing offer the marketer states is written at SKILL step 9).View the complete source on GitHubemail-lifecycle-send-check
When your agent uses it
Checks a drafted email flow or broadcast before it is loaded: flow logic and exits, overlaps, offer depth and codes, stock, claims, consent and legal footer, SMS rules, rendering, voice and AI-copy tells, and the goal metric. Returns a pass / fixed / open-question table. Use alone when you already have the finished draft and the brand's product and policy facts; otherwise run email-lifecycle.
What it loads into context
Frontmatter
110 tokensAlways available to the agent
SKILL.md
831 tokensWhen the skill is activated
Reference documents
7,412 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
../ad-policy-check/disclosure.mddoc3,120 bytes../claims-gate/SKILL.mddoc15,033 bytesSKILL.mdcore3,777 bytesskill.meta.jsonasset457 bytes../email-lifecycle/references/copy-craft.mddoc3,615 bytes../email-lifecycle/references/deliverability.mddoc5,877 bytes../email-lifecycle/references/sms-push-whatsapp.mddoc3,146 bytes
Read SKILL.md
# send-check
**Reads:** the drafted flows and broadcasts; `../email-lifecycle/references/copy-craft.md`; `../email-lifecycle/references/deliverability.md`; `../email-lifecycle/references/sms-push-whatsapp.md`; the result of the `claims-gate` skill (`../claims-gate/SKILL.md`) for every message (run first, in SKILL step 7); `../ad-policy-check/disclosure.md` (in the `ad-policy-check` skill) for email and SMS disclosure; product records; `lifecycle/program.md`.
**Checks — each item pass / fixed / open question:**
- **Flow logic:** purchasers exit on every step ("placed order since starting"); checkout suppresses cart suppresses browse; a cross-flow cap and smart sending set; re-entry windows set; post-purchase keyed to delivery, not order date; replenishment uses the product's cycle and skips subscribers; every split has a default branch; a sequence built as broadcasts carries an active (dynamic) exclusion list on every send after the first, never a static one; the plan's monthly send limit is respected.
- **Offers:** none deeper than allowed (offer-math ran); unique, single-use, non-stacking codes with expiry; recent purchasers excluded from promos; full-price returning customers never discounted in cart flows.
- **Stock and data:** every featured product in stock; prices pulled live, not typed; every merge tag has a fallback; dynamic blocks hide out-of-stock lines.
- **Claims:** the claims gate has run on every message and its cuts are applied (this atom does not judge claims itself). Shipping, returns and guarantee promises match the `Policy:` facts and the `[lifecycle]` policy rules, including ones confirmed in this run's message 2 and written at step 9. Drug-like wording and financial promises the gate kept are still flagged for a human read — the sentence, not the whole category.
- **Compliance:** consent per market (no abandoned-checkout email to non-subscribed Canadian contacts; CASL implied-consent windows); footer with legal name and postal address via the tool's own tag, visible unsubscribe and preference link, one-click unsubscribe header noted for the tool; SMS: separate consent, brand name, STOP language, quiet hours, local rules for the markets; review requests go to all customers, not only happy ones; no marketing to marketplace-sourced buyers.
- **Rendering:** single column, mobile first, live text, alt text on every image, full plain-text part, dark-mode-safe logo, HTML under 102 KB, seed tests listed for Gmail, Outlook, Apple Mail, Yahoo.
- **Voice and craft:** brand banned words; the 14-item failure list in `copy-craft.md`; one job and one primary CTA per message; subject and preview not repeating.
- **Measurement:** goal metric per flow (never opens); holdout only on always-on marketing flows with enough volume (never transactional, legally required, booking, dunning or one-time launch messages — "no holdout — <reason>"); the random-sample split sits after the message that delivers what the form or a transaction promised — a holdout placed before it fails; one test per flow or send; UTMs consistent.
View the complete source on GitHubhonest-review
When your agent uses it
Shared step of the marketing playbooks (make-static-ads, run-organic-social): how to review generated images and video honestly. Covers what was seen by eye versus read automatically, findings framed as things for the human to confirm, remakes only after a yes to the price, and at most two tries per item. Loaded by those playbooks; not for direct use.
What it loads into context
Frontmatter
100 tokensAlways available to the agent
SKILL.md
845 tokensWhen the skill is activated
Reference documents
2,499 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Know what you can perceive
- 2. Compare against the truth, not against expectations
- 3. Report findings honestly
- 4. Remakes
- 5. Record
Files
SKILL.mdcore3,611 bytesskill.meta.jsonasset428 bytes../save-learning/SKILL.mddoc9,842 bytes
Read SKILL.md
# honest-review
Used by: make-static-ads (its render-review step) and run-organic-social. The rubric — what to check — lives in each playbook; this atom is how to check and how to report.
## 1. Know what you can perceive
| You can | How | Say |
|---|---|---|
| See images | The host shows them, or a shell host downloads the file and opens it | "checked by eye" |
| Read an automatic description | `gooseworks:media_analyze` on the asset (description, visible text, for video a word-timed transcript and sampled shots) | "the automatic read shows…" |
| Watch motion or hear audio | Almost never — a transcript and sampled frames are not watching | never claim it |
Decide the mode at the start and label every item with how it was checked. Never present the engine's own "passed" or "checked" as your review.
View the complete source on GitHubimprove-search-visibility
When your agent uses it
SEO and AI-answer visibility. Use for a site SEO or technical audit with ranked fixes, competitor keyword and topic gaps, a topic cluster, SEO metrics for domains, a programmatic SEO page-set plan, or checking where ChatGPT and Google name the brand. Delivers the requested audit, comparison, map or blueprint with dated evidence and clear data limits. Also covers app store listings and local search. Drafts changes; never edits live. Full pages go to make-content; paid search goes to run-paid-campaigns.
What it loads into context
Frontmatter
133 tokensAlways available to the agent
SKILL.md
2,451 tokensWhen the skill is activated
Reference documents
53,242 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Scripts executed separately
tests/run-fixtures.py
Files
../claims-gate/SKILL.mddoc15,033 bytes../improve-search-visibility-fix-writer/SKILL.mddoc3,674 bytes../improve-search-visibility-page-and-foundation-check/SKILL.mddoc3,157 bytesSKILL.mdcore11,272 bytesSKILL.mdcore11,272 bytesSKILL.mdcore11,272 bytesSKILL.mdcore11,272 bytesreferences/app-store-listing.mddoc2,503 bytesreferences/battlegrounds.mddoc3,859 bytesreferences/citation-protocol.mddoc8,628 bytesreferences/entity-and-local.mddoc4,381 bytesreferences/finished-fix-examples.mddoc8,950 bytesreferences/foundation-check.mddoc7,698 bytesreferences/free-pass.mddoc4,830 bytesreferences/gap-to-fix.mddoc5,661 bytesreferences/page-map.mddoc4,946 bytesreferences/prioritising.mddoc2,969 bytesreferences/question-list.mddoc5,646 bytesreferences/report-template.mddoc4,744 bytesreferences/rival-content-map.mddoc4,440 bytesreferences/run-memory.mddoc15,383 bytesreferences/seo-data.mddoc6,860 bytesreferences/seo-jobs.mddoc9,969 bytesskill.meta.jsonasset6,813 bytestests/fixture-reports/audit.jsonasset7,033 bytestests/fixture-reports/audit.mddoc5,679 bytestests/fixture-reports/cluster.jsonasset7,088 bytestests/fixture-reports/cluster.mddoc4,081 bytestests/fixture-reports/gaps.jsonasset5,798 bytestests/fixture-reports/gaps.mddoc3,898 bytestests/fixture-reports/metrics-export.jsonasset3,560 bytestests/fixture-reports/metrics-export.mddoc1,960 bytestests/fixture-reports/metrics-missing.jsonasset3,402 bytestests/fixture-reports/metrics-missing.mddoc1,845 bytestests/fixture-reports/metrics-traffic-only.jsonasset3,994 bytestests/fixture-reports/metrics-traffic-only.mddoc2,114 bytestests/fixture-reports/metrics.jsonasset5,091 bytestests/fixture-reports/metrics.mddoc3,153 bytestests/fixture-reports/pseo.jsonasset9,775 bytestests/fixture-reports/pseo.mddoc6,697 bytestests/fixtures/coldfield.jsonasset21,913 bytestests/run-fixtures.pyruns7,864 bytestests/test-by-hand.mddoc9,622 bytes../marketing-guide/SKILL.mddoc17,316 bytes../run-memory/SKILL.mddoc18,060 bytes../save-learning/SKILL.mddoc9,842 bytes../save-to-brain/SKILL.mddoc6,868 bytes../spend-gate/SKILL.mddoc6,102 bytes../write-report/SKILL.mddoc8,986 bytes
Read SKILL.md
# Human version
Get the search work you asked for: an SEO audit, competitor gaps, a topic map, domain metrics, a plan for templated pages, or an AI-answer visibility check. The report shows the evidence, the priorities and what remains unknown. Changes stay drafts for review.
---
# Agent version
## What you get
One readable, linked report containing the requested deliverable. An audit returns the requested number of ranked fixes; a topic map shows the pillar, supporting pages and links; a pSEO plan includes the templates and data needed to build useful page sets. SEO metrics are obtained and shown when access allows, with missing data stated plainly. Finished copy and code belong in the report's closing editor section; new-page briefs use the existing page-map shape.
## Before you start
View the complete source on GitHubimprove-search-visibility-citation-check
When your agent uses it
Step of the improve-search-visibility playbook: runs the agreed buyer questions on AI and Google surfaces, records every run and scores how often the brand is named. Run improve-search-visibility instead; not for direct use.
What it loads into context
Frontmatter
72 tokensAlways available to the agent
SKILL.md
742 tokensWhen the skill is activated
Reference documents
7,086 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore3,226 bytesSKILL.mdcore3,226 bytesskill.meta.jsonasset416 bytes../improve-search-visibility/references/citation-protocol.mddoc8,628 bytes../improve-search-visibility/references/run-memory.mddoc15,383 bytes../spend-gate/SKILL.mddoc6,102 bytes
Read SKILL.md
# citation-check
**Reads:** `search/questions.md`; `../improve-search-visibility/references/citation-protocol.md`; the last run record's per-question snapshot (`../improve-search-visibility/references/run-memory.md`); the canonical brand facts from the brain (for accuracy checks on brand questions); the tracked competitor list.
**Does:**
1. **Free pass (step 1):** ChatGPT, AI Overview and AI Mode in the host's own browser (private window, signed out; stop on any CAPTCHA or refusal and mark the surface), and the host's web search for who ranks, labelled "web search". **Paid top-up (step 3, only after the one yes):** Google's exact page one through `gooseworks:data_call_provider` (provider `scrapecreators`, path `/v1/google/search`, the query and region), inside the ceiling (the `spend-gate` skill (`../spend-gate/SKILL.md`) proxy branch), stopping at it. No browser → the minimum paste set, offered in the first message.
2. **Run** — ChatGPT once per question and three times for the key questions; AI Overview and AI Mode once each when Google allows; Google page one once per question in the top-up; pasted: 5 questions (up to 4 key questions + at least one brand question), ChatGPT twice, AI Overview and AI Mode once each. New chat per question, memory off, never the brand name in non-brand prompts. Wait for each answer to finish (protocol's wait rule); unfinished answers are retried once, never scored as misses.
3. **Only this run's observations count.** An earlier run's answers are the baseline from the last run record (`../improve-search-visibility/references/run-memory.md`): shown as "last checked <date>" beside today's reading and compared only like with like (same question version, same route and location, the noise rule there), never counted in today's numbers or tables. A surface not checked today says "not checked today".
4. **Record** every run with the full field list; save verbatim answers. Note whether ChatGPT searched (sources shown) — answers without search come from training memory.
5. **Classify** every cited URL by source type. For brand questions, list each stated fact and compare it to the brain: correct / wrong (quote both) / not on file.
6. **Score** each row (named k of N, won/partial/lost/no-brand answer, prominence, stable or unstable), then mention rate per surface and stage, own-citation rate, third-party coverage and share of voice against the brands the engines named. Won = ≥ ⅔ of runs; unstable = some but not all; one run is never stable.
**Writes:** the rows table used by the report and the verbatim runs file (`search/visibility/<date>-runs.md`, not imported); every charge is logged by the spend gate, and the report states credits charged against the ceiling in the gate's own words.
**Never:** reports one run as fact; passes an organic or API read off as what buyers see in the AI apps; ranks the brand "#2 in ChatGPT".View the complete source on GitHubimprove-search-visibility-entity-footprint
When your agent uses it
Step of the improve-search-visibility playbook: checks the profiles answer engines read, plus local listings and reviews, against the brand's facts and writes corrections. Run improve-search-visibility instead; not for direct use.
What it loads into context
Frontmatter
72 tokensAlways available to the agent
SKILL.md
397 tokensWhen the skill is activated
Reference documents
980 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore1,823 bytesskill.meta.jsonasset247 bytes../improve-search-visibility/references/entity-and-local.mddoc4,381 bytes
Read SKILL.md
# entity-footprint
**Reads:** `../improve-search-visibility/references/entity-and-local.md`; the canonical facts from the brain (name, one-liner, category, founding facts, domain, pricing, locations); brand-question accuracy errors from the citation check and the sources they traced to.
**Does:**
1. Confirm the canonical facts with the human if the brain lacks any (never guess founding year, HQ, NAP).
2. Pick the five profiles that matter for this type (always include any profile an engine cited for a wrong fact). Read each public page with the host's fetch where allowed (never G2, Capterra, Trustpilot or Amazon — they forbid automated collection; blocked or no fetch → ask for a screenshot, else "not checked"); mark complete / inconsistent / missing / unclaimed and list mismatches.
3. Local: per location (worst 2–3 first on a large chain) the Business Profile fields, NAP across directories, review count, average, recency and reply rate.
4. Write each correction as exact field values plus how to edit (claim steps, vendor portal, suggest-an-edit). Review gaps → a review-request brief addressed to email-lifecycle. No reply drafts: replying to reviews is not covered yet (say so plainly).
**Writes:** the entity table and candidate fixes.
**Never:** drafts a Wikipedia article; adds an unsourced Wikidata item; suggests fake or gated reviews or incentives tied to a positive rating (a platform's own disclosed programme is fine); adds keywords to a Business Profile name.View the complete source on GitHubimprove-search-visibility-fix-writer
When your agent uses it
Step of the improve-search-visibility playbook: turns one ranked fix into paste-ready site copy or code with owner, risk and undo, and writes page briefs. Run improve-search-visibility instead; not for direct use.
What it loads into context
Frontmatter
73 tokensAlways available to the agent
SKILL.md
871 tokensWhen the skill is activated
Reference documents
10,823 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
../claims-gate/SKILL.mddoc15,033 bytesSKILL.mdcore3,674 bytesskill.meta.jsonasset412 bytes../improve-search-visibility/references/finished-fix-examples.mddoc8,950 bytes../improve-search-visibility/references/gap-to-fix.mddoc5,661 bytes../improve-search-visibility/references/page-map.mddoc4,946 bytes../improve-search-visibility/references/prioritising.mddoc2,969 bytes../improve-search-visibility/references/seo-jobs.mddoc9,969 bytes
Read SKILL.md
# fix-writer
**Reads:** `../improve-search-visibility/references/finished-fix-examples.md`, `../improve-search-visibility/references/gap-to-fix.md`, `../improve-search-visibility/references/prioritising.md`; `../improve-search-visibility/references/page-map.md`; the page map row the fix or brief comes from; the brand's voice; product records; the CMS and who ships (from intake). Claims are decided by the `claims-gate` skill (`../claims-gate/SKILL.md`), run over every finished fix in SKILL step 4 — this atom never decides a claim itself.
**Does:**
0. Honor the request's count and job scope from `../improve-search-visibility/references/seo-jobs.md`. A technical finding with insufficient code/CMS access gets an exact engineering handoff (affected URLs, observed defect, proposed outcome, verification and risk/undo), not guessed implementation. Use `Agent: <time> - Human: <active time>` when estimating work.
1. Write the change itself: the exact title/meta/H1/opening paragraph, Q&A block, markup, field values, robots line, listing text or drafted inclusion request — in the CMS's terms (where in Shopify / WordPress / Webflow it goes; markup as an edit to the theme's existing block with live values, never a second hard-coded block).
2. **Facts in the draft:** mark every sentence that states a fact with its source (a "Claims you may use" fact, a product record field, or [PROOF NEEDED]) so the claims gate can keep, rewrite or cut it. The live page supplies plain product facts only (name, price, size, listed ingredients, how to use) — re-read prices from it; ratings and review counts appear only as a "Claims you may use" fact, or in markup that mirrors reviews shown on the page. **The brand's own marketing lines are claims too** ("closes the loop", "self-improving", "growth outcomes" from the site, the kit description or value props): without sign-off they are cut or rewritten to plain facts, or shown as `[needs your sign-off: …]` — never pasted into fix copy as ready to publish. **No comparison table or outreach line about a rival** unless each cell comes from that rival's own page, read this run and cited; otherwise leave the rival out. Competitor facts come only from the competitor's own page, read this run and cited with its date — never from a list or a review site — and only if the human allows naming rivals.
3. **Two versions of every fix.** For the report's "What to do" section, plain words only: what changes and where, who does it and how long, why it is a priority (the gap it closes, said as the buyer question it fixes — never a question id), how we'll know it worked. For the report's last section, "For whoever edits your site": the finished copy, field values or code and exactly where it goes, plus time to show, risk and undo.
4. **Page briefs** ("needed" rows of the page map, listed separately from this week's visibility fixes) to `search/briefs/<page-slug>.md` in the exact shape in `../improve-search-visibility/references/page-map.md` (make-content's brief input).
**Writes:** both versions into the report, the working copy into `search/fixes/<date>.md`; brief files. Briefs name the questions they answer in words, not ids.
**Never:** "add an FAQ", "improve E-E-A-T" or any instruction without the finished text; invented stats, prices, dates or reviews; FAQ markup promised as a rich result.View the complete source on GitHubimprove-search-visibility-page-and-foundation-check
When your agent uses it
Step of the improve-search-visibility playbook: audits site indexing, crawling, technical and page issues at the requested scope, or checks pages behind lost visibility questions. Run improve-search-visibility instead; not for direct use.
What it loads into context
Frontmatter
73 tokensAlways available to the agent
SKILL.md
679 tokensWhen the skill is activated
Reference documents
4,972 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore3,157 bytesskill.meta.jsonasset256 bytes../improve-search-visibility/references/foundation-check.mddoc7,698 bytes../improve-search-visibility/references/gap-to-fix.mddoc5,661 bytes../improve-search-visibility/references/seo-jobs.mddoc9,969 bytes
Read SKILL.md
# page-and-foundation-check
**Reads:** `../improve-search-visibility/references/foundation-check.md`, `../improve-search-visibility/references/gap-to-fix.md`; the requested audit scope (`../improve-search-visibility/references/seo-jobs.md`) or gap rows and nearest pages for a visibility check; sitemap/crawl inventory and Search Console export when available.
**Does (free checks first):**
0. **Find the pages.** `gooseworks:knowledge_import` in its website **discover** mode lists up to 25 same-site pages for free; use these as starting leads, then inventory the requested scope from sitemaps/feeds/indexes or crawl exports; 25 is not the site's page limit. Import mode only when the host cannot fetch pages at all: the needed selected pages, only inside the same ceiling the human agreed (the import's own cap described in words, per the spend gate), then read them with `gooseworks:knowledge_search`.
1. **Site-wide once (free):** fetch robots.txt and classify every rule by retrieval vs training bot; with a shell, test CDN blocking by requesting a page as OAI-SearchBot and PerplexityBot vs a normal agent (no shell → not checked, developer checklist); sitemap; duplicate platform host; Search Console and Bing Webmaster Tools set up (from intake). Indexing comes from Search Console if shared, else from the one paid `site:` probe of the credit flow (step 4).
2. **Per page:** status and redirects, canonical, robots meta and header, content visible without JavaScript, title/H1/meta, the answer-first opening, structured data validity and match with visible text, field speed data where available, internal links in.
3. **Compare with the winner (when relevant to the job):** for each lost key question, the passage the engine lifted from the winning page vs the brand's page — what the winner states that the brand does not.
4. **Near-winners:** from available Search Console or clearly labelled managed SEO/query evidence, queries around positions 4–15; high impressions/low click rate only from own performance data. For an audit, include relevant queries beyond a prior AI question set.
5. For technical audits, include the foundation reference's applicable migration, facet, rendering and competing-page checks. State sample coverage; implement nothing live. Mark everything pass / fail / not checked. Use the host's own fetch or shell; what it cannot see goes to a short developer checklist — never a technical question to the human. Read the theme's existing structured data before proposing any.
**Writes:** the foundation table and per-page notes for the report; candidate fixes (blockers flagged) for fix ranking.
**Never:** marks an item passed that it did not see; proposes a structural change (robots, redirects, noindex, URL change) as anything but a proposal with risk and undo.View the complete source on GitHubimprove-search-visibility-question-set
When your agent uses it
Step of the improve-search-visibility playbook: drafts and scores the buyer-question set in AI and Google forms and groups it into page clusters. Run improve-search-visibility instead; not for direct use.
What it loads into context
Frontmatter
67 tokensAlways available to the agent
SKILL.md
728 tokensWhen the skill is activated
Reference documents
2,225 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore3,188 bytesskill.meta.jsonasset243 bytes../improve-search-visibility/references/battlegrounds.mddoc3,859 bytes../improve-search-visibility/references/question-list.mddoc5,646 bytes
Read SKILL.md
# question-set
**Reads:** `../improve-search-visibility/references/question-list.md`, `../improve-search-visibility/references/battlegrounds.md`; brand summary, products, audience, competitors (`gooseworks:brand_read`, `gooseworks:competitor_read`); research-audience's `research/audience/voc-bank.md` and research-market's `research/market/demand.md` if present; customer language via `gooseworks:knowledge_search` with `source_types: ["document", "evidence"]` (query "Voice-of-customer bank — customer questions, objections, words customers use"); Search Console export if shared; the previous `search/questions.md` and `search/page-map.md` on re-runs.
**Does:**
0. **Cover every audience the site sells to.** If the site sells to more than one buyer or carries more than one positioning, include questions for each, so the decisions message can ask which buyer to win.
1. Re-run: reuse the saved set, then **top it up to the mix** — at least 3 brand-accuracy questions and every audience the site sells to — before anything runs; propose at most 3 other additions or swaps with reasons; keep ids stable — the same id always means the same words: a reworded question gets a new id and the old one is marked `retired (reworded → Q<n>, v<N>)`, so the next run never compares different wordings.
2. First run: draft 18–20 candidates across the stage mix in both forms, never with the brand name in non-brand questions; 3–6 brand-accuracy questions always; local variants per city for physical businesses.
3. Score value (buying intent 1–5, `../improve-search-visibility/references/question-list.md`) × winnability (1–3) provisionally with a one-line reason each; drop to the best 12–15. A brand name that is a common word always carries the category in brand questions. Pre-launch: category questions plus one name-collision question only.
4. **Cluster and weight.** Group the questions into clusters (one cluster = one page that should answer them); with a Search Console export, sum each cluster's impressions as its demand weight and add any high-impression query the list missed. These clusters are the page map's rows.
5. **Pick the key questions yourself** (the 3–5 highest value × winnability) and run the set — no approval before the free pass. The first message shows the set grouped by cluster for edits; edits apply to the paid top-up and the next runs.
**Writes:** `search/questions.md` in the saved-set format (version, date, country, language, engines, runs·route line, the table with a cluster column).
**Never:** invents search volumes or "how many people ask this". Demand comes from Search Console, Google Trends or autocomplete (free), Keyword Planner when the brand shares it, or a vendor prompt-volume estimate the brand already has — always labelled with its source, estimates as estimates; otherwise "no demand data, ranked by judgment".View the complete source on GitHubimprove-search-visibility-store-listing-audit
When your agent uses it
Audits an app's App Store and Google Play listing against three competitors (title, subtitle, description opening, first screenshots and captions, rating, review themes) and writes a field-by-field rewrite with character counts, or a launch-day listing before release. Use alone when you already have the app's store links and signed-off product facts; otherwise run improve-search-visibility.
What it loads into context
Frontmatter
107 tokensAlways available to the agent
SKILL.md
404 tokensWhen the skill is activated
Reference documents
620 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore1,818 bytesskill.meta.jsonasset284 bytes../improve-search-visibility/references/app-store-listing.mddoc2,503 bytes
Read SKILL.md
# store-listing-audit
**Reads:** `../improve-search-visibility/references/app-store-listing.md`; the store links from Before-you-start step 4's lookup (ask only if not found); the iOS keyword field (asked — not public); the "best app for X" rows from the citation check; product facts from the brain.
**Does:**
0. Before release: write the launch-day listing (name, subtitle, keywords, short description, first three captions, with counts) and skip the comparison of ratings.
1. Read the public listings (host fetch; blocked or no fetch → ask for screenshots) for the brand and three competitors: name/title, subtitle/short description, description opening, first three screenshots and captions, rating and count, recent review themes.
2. Write the rewrite table: field · now · proposed · count · why — following the indexing rules; every product statement kept only if the claims gate allows it (SKILL step 4) — captions like "works offline" or "never jolts" are claims.
3. Rating below ~4.3: an engineering ticket for the native rating prompt after a positive moment.
4. Note that iOS name, subtitle and keywords ship with the next app version.
**Writes:** the listing fix (candidate for the five) and the audit table for the report.
**Never:** uses rival trademarks; claims a keyword rank it cannot see.View the complete source on GitHubmake-content
When your agent uses it
Writes marketing content: articles, single posts, newsletters, scripts and repurposed cuts, each with an edit note and a claims check. Use when a marketer says "write a blog post / case study", "write a LinkedIn or X post / thread / X article", "carousel copy", "draft this week's newsletter", "turn this webinar into posts" or "repurpose this", "write a TikTok or YouTube script", "refresh this old post", or "write the page from this SEO brief". Words only; nothing is invented or published. Not for a dated posting calendar — use run-organic-social; not ad copy (make-static-ads) or promo emails (email-lifecycle). Press releases, landing and product pages, and sales decks are not covered.
What it loads into context
Frontmatter
188 tokensAlways available to the agent
SKILL.md
3,847 tokensWhen the skill is activated
Reference documents
30,382 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
../ad-policy-check/disclosure.mddoc3,120 bytes../claims-gate/SKILL.mddoc15,033 bytes../make-content-content-brief/SKILL.mddoc6,372 bytes../make-content-source-to-units/SKILL.mddoc2,930 bytes../make-content-two-pass-edit/SKILL.mddoc3,093 bytesSKILL.mdcore15,924 bytesSKILL.mdcore15,924 bytesSKILL.mdcore15,924 bytesSKILL.mdcore15,924 bytesSKILL.mdcore15,924 bytesSKILL.mdcore15,924 bytesreferences/editing.mddoc7,188 bytesreferences/fact-rules.mddoc4,088 bytesreferences/formats.mddoc13,448 bytesreferences/point-of-view.mddoc5,731 bytesreferences/repurposing.mddoc8,797 bytesskill.meta.jsonasset5,049 bytestests/test-by-hand.mddoc6,897 bytes../marketing-data-access/SKILL.mddoc7,955 bytes../marketing-guide/SKILL.mddoc17,316 bytes../save-learning/SKILL.mddoc9,842 bytes../save-to-brain/SKILL.mddoc6,868 bytes../spend-gate/SKILL.mddoc6,102 bytes
Read SKILL.md
# make-content
## What you get
One of five things, saved to the brand's workspace and shown in chat:
1. **A repurposed set.** One finished asset is mined into scored units. Each platform the brand uses gets a native version with a different lead unit and hook, ready to paste. Each version has an asset line saying what visual it needs and who makes it.
2. **A single post.** One LinkedIn, X, Threads or Instagram post, a thread, or an X long post or Article (references/formats.md), written native to its platform. It skips the calendar and the units table unless there is a source asset.
3. **A fresh piece.** A one-page brief, then a first draft in the brand's (or a named author's) voice. Long-form adds the publish kit: headline options, meta, slug, H2 skeleton, internal links, CTA, image notes and distribution notes.
4. **A refresh redline.** An old piece rewritten where it decays, with each change and its reason.
5. **This week's newsletter issue,** written from a saved template and the week's notes.
Every piece carries an **edit note** and a **claims check**: what was kept, softened and cut, and the proof that would restore each cut. The formats are listed in references/formats.md. Anything else is routed (Out of scope).
View the complete source on GitHubmake-content-content-brief
When your agent uses it
Writes a one-page content brief before any draft: audience, intent, the one arguable point, what top results already say and what this piece adds, an outline, a proof inventory with gaps marked, voice, CTA and banned words, checked against six gates. Use alone when you already have the topic, format, audience and destination and want only the brief; otherwise run make-content.
What it loads into context
Frontmatter
103 tokensAlways available to the agent
SKILL.md
1,572 tokensWhen the skill is activated
Reference documents
12,399 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Read first (all free)
- The brief (fill every line; use `../make-content/references/formats.md` for the format's anatomy)
- Gates before drafting
- Save
Files
../claims-gate/SKILL.mddoc15,033 bytesSKILL.mdcore6,372 bytesSKILL.mdcore6,372 bytesSKILL.mdcore6,372 bytesskill.meta.jsonasset412 bytes../make-content/references/fact-rules.mddoc4,088 bytes../make-content/references/formats.mddoc13,448 bytes../make-content/references/point-of-view.mddoc5,731 bytes../marketing-data-access/SKILL.mddoc7,955 bytes../spend-gate/SKILL.mddoc6,102 bytes
Read SKILL.md
# Content brief
No fresh draft starts without a brief. Write it, check it against the six gates below, and save it before drafting.
## Read first (all free)
- `gooseworks:brand_read` `sections: ["summary","kit","learnings"]`, lean (it returns every `must`/`dont` fact; read learnings in full only for `do`/`insight` rules): the voice, audience, value props, the kit's reference examples and templates, and the learnings (`must` / `do` / `dont`). Read the kit in full (alone: `sections: ["kit"]`, `detail: "full"`) only when you need its example lines or images.
- `gooseworks:knowledge_search` with the topic as the query, across all source types. This returns past creatives and feedback, saved rules, customer evidence and documents. Then work out which brand claims are usable through the shared claims gate (the `claims-gate` skill, `../claims-gate/SKILL.md`): signed-off claims, the scoped sign-off this run, or plain product facts only. Proof slots may only hold usable claims and the sourced facts in `../make-content/references/fact-rules.md`.
- The voice-of-customer bank (research-audience writes it): `gooseworks:file_read` `research/audience/voc-bank.md` (brand coworker scope). If it is not there, use `gooseworks:knowledge_search` `source_types: ["document","evidence"]`, query "voice-of-customer bank <topic>". It gives buyer phrases, objections and questions on this topic, each with its source and date.
- When the ask comes from a sibling:
- **improve-search-visibility page brief:** `gooseworks:file_read` `search/briefs/<page-slug>.md`. It gives the cluster, intent, the questions the page must answer, the facts it must state, the claims allowed and the competitor-name rules. Put the brief's path on the draft's first line.
- **plan-campaign asset list:** `gooseworks:campaign_read` `campaign_id` gives the brief, the concepts and the asset row.
- **analyze-performance "what to make next":** the latest `reports/performance/<date>.md` (`gooseworks:file_list` `reports/performance/`), its "what to make next" section.
- When it is a comparison: `gooseworks:competitor_read` for dated competitor facts.View the complete source on GitHubmake-content-source-to-units
When your agent uses it
Step of the make-content playbook: mines one finished asset into scored quotable units and maps a different lead unit to each platform. Run make-content instead; not for direct use.
What it loads into context
Frontmatter
61 tokensAlways available to the agent
SKILL.md
715 tokensWhen the skill is activated
Reference documents
2,125 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Output table
- Then map
Files
SKILL.mdcore2,930 bytesSKILL.mdcore2,930 bytesSKILL.mdcore2,930 bytesSKILL.mdcore2,930 bytesSKILL.mdcore2,930 bytesSKILL.mdcore2,930 bytesskill.meta.jsonasset224 bytes../make-content/references/repurposing.mddoc8,797 bytes
Read SKILL.md
# Source to units
Input: the full text or transcript of one finished asset (`../make-content/references/repurposing.md` §1 says how to get it in). Read it completely before mining. Never mine from a summary.
## Output table
```
Source: <title> · <link or media_asset_id> · <length/duration>
| # | Type | Anchor (verbatim, ≤25 words) | Where (timestamp / ¶) | Alone | Charge | Novel | Proof | Total | Best homes |
|---|------|------------------------------|-----------------------|-------|--------|-------|-------|-------|------------|
```
- **Type:** claim · contrarian take · story · stat · quote · framework/steps · mistake+fix · before/after · objection+answer · audience Q · demo moment.
- **Scores (1–3):**View the complete source on GitHubmake-content-two-pass-edit
When your agent uses it
Edits an existing draft in order: a substance pass (arguable thesis, swap test, fakes removed, CTA fit), a claims and fact check that cuts or softens unproven lines, a readability and voice-match pass, then an AI-tell sweep, with an edit note listing open gaps. Use alone when you already have a finished draft and the brand's voice samples and approved claims; otherwise run make-content.
What it loads into context
Frontmatter
114 tokensAlways available to the agent
SKILL.md
779 tokensWhen the skill is activated
Reference documents
7,115 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Edit note (attached to the piece)
Files
../ad-policy-check/disclosure.mddoc3,120 bytes../claims-gate/SKILL.mddoc15,033 bytesSKILL.mdcore3,093 bytesskill.meta.jsonasset435 bytes../make-content/references/editing.mddoc7,188 bytes../make-content/references/fact-rules.mddoc4,088 bytes
Read SKILL.md
# Edit, check, edit
Run on every fresh draft, refresh redline and repurposed set. The full checklists are in `../make-content/references/editing.md`.
1. **Substance pass.** Write four answers into the edit note:
- the thesis in one arguable sentence;
- the swap test (pass, or what fails);
- the fakes removed;
- whether the CTA matches the intent.
Run the rest of Pass 1 (so-what, proof density, skeptic, order, hedging) as checks. Fix what fails without writing it up.
2. **Claims check:** the shared claims gate (the `claims-gate` skill, `../claims-gate/SKILL.md`) for brand claims, plus `../make-content/references/fact-rules.md` for world facts, competitor facts, stories, sensitive topics and third-party rights. When the piece is sponsored, affiliate, gifted or a creator collaboration, also load `../ad-policy-check/disclosure.md` (in the `ad-policy-check` skill) and apply it (disclosure in the piece itself, before "more"). It cuts and softens lines, which leaves gaps.
3. **Readability pass** on the post-cut text: smooth the gaps, headline, lede, H2s as claims, scannability, ending. Then **voice match** against the best voice sample available, in this order:
1. the named author's voice card (bylined pieces);View the complete source on GitHubmake-static-ads
When your agent uses it
Make new static image ads, a fresh batch, more ads, a winner's variations, copy variants or a rejected ad fix. Reads the brand, its customers and the ads it already runs, turns real product facts and customer situations into distinct visual ideas, shows a concept board, writes each render prompt, quotes, renders and reviews through GooseWorks. Also handles requested branded header/social graphics. Use for static ad creation rather than goose-ads. Not for video, product photos or launching campaigns.
What it loads into context
Frontmatter
119 tokensAlways available to the agent
SKILL.md
3,413 tokensWhen the skill is activated
Reference documents
42,408 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Other modes
- Approval gates
- Output and write-back
- Done when
- Out of scope
Scripts executed separately
scripts/place_logo.pyscripts/repair_patch.pyscripts/template_sheet.pytests/test_place_logo.pytests/test_repair_patch.pytests/test_template_sheet.py
Files
../ad-policy-check/SKILL.mddoc7,058 bytes../claims-gate/SKILL.mddoc15,033 bytes../make-static-ads-ad-copy/SKILL.mddoc3,078 bytes../make-static-ads-claims-extract/SKILL.mddoc3,014 bytes../make-static-ads-compose/SKILL.mddoc2,758 bytes../make-static-ads-concept-grid/SKILL.mddoc6,380 bytes../make-static-ads-copy-variants/SKILL.mddoc2,825 bytes../make-static-ads-fix-rejected/SKILL.mddoc2,771 bytes../make-static-ads-graphic-request/SKILL.mddoc4,593 bytes../make-static-ads-render-review/SKILL.mddoc6,583 bytesSKILL.mdcore14,292 bytesSKILL.mdcore14,292 bytesreferences/brand-profile.mddoc4,993 bytesreferences/claims-and-policy.mddoc7,033 bytesreferences/engine-notes.mddoc3,503 bytesreferences/fonts-and-color.mddoc2,534 bytesreferences/formats-and-placements.mddoc2,261 bytesreferences/handoff-format.mddoc4,451 bytesreferences/ideas.mddoc6,629 bytesreferences/levels.mddoc4,320 bytesreferences/prompts.mddoc7,852 bytesreferences/reading-the-brain.mddoc6,154 bytesreferences/review-rubric.mddoc6,767 bytesscripts/README.mddoc2,149 bytesscripts/place_logo.pyruns3,677 bytesscripts/repair_patch.mddoc2,526 bytesscripts/repair_patch.pyruns9,239 bytesscripts/template_sheet.pyruns3,804 bytesskill.meta.jsonasset6,429 bytestests/test-by-hand.mddoc5,028 bytestests/test_place_logo.pyruns1,978 bytestests/test_repair_patch.pyruns6,048 bytestests/test_template_sheet.pyruns1,544 bytes../marketing-guide/SKILL.mddoc17,316 bytes../run-memory/SKILL.mddoc18,060 bytes../save-learning/SKILL.mddoc9,842 bytes../spend-gate/SKILL.mddoc6,102 bytes
Read SKILL.md
# make-static-ads
**The idea is the job, and it must be this brand's idea.** An ad idea is a real product fact or customer situation turned into one visible event the viewer gets at a glance (`references/ideas.md`), said the way this brand already talks and looks (`references/brand-profile.md`), built on a template at the creativity level the marketer chose (`references/levels.md`). Everything else serves that idea or protects the brand.
The proof that the work happened is the **concept board**, shown to the marketer before any render credits are spent. It cannot be skipped, shortened to "your choice", or replaced by a summary.
## What you get
Finished, reviewed images with their ad copy, the concept board behind them, what was cut and why, and a batch file the launch reads.
## Before you start
- **Setup.** Run the `marketing-guide` skill (`../marketing-guide/SKILL.md`) §1–2 only: connect, `gooseworks:get_started`, pick the brand, the workspace scope, and the current names of the brand-brain tools. If `get_started` shows a brand-setup or sign-in card, wait for its press; any other card: the Server hints bullet below.
- **Render tool.** No `ads_render` → stop before spending and say so; `ads_generate` rewrites your prompt through templates and is not a substitute.View the complete source on GitHubmake-static-ads-ad-copy
When your agent uses it
Step of make-static-ads: writes the text for each slot the ad's template sets, then the primary texts, headline, description and CTA around the image, from usable facts and customer words. Run make-static-ads instead; not for direct use.
What it loads into context
Frontmatter
74 tokensAlways available to the agent
SKILL.md
735 tokensWhen the skill is activated
Reference documents
2,754 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. On-image copy
- 2. Copy around the image
- 3. Checks
Files
SKILL.mdcore3,078 bytesSKILL.mdcore3,078 bytesSKILL.mdcore3,078 bytesskill.meta.jsonasset232 bytes../make-static-ads/references/claims-and-policy.mddoc7,033 bytes../make-static-ads/references/levels.mddoc4,320 bytes
Read SKILL.md
# ad-copy
**Reads:** each `board.md` row (with its level and template), `profile.md` (how the brand writes), customer words, the claims on file, brand voice and rules. **Writes:** final on-image copy into the board; the surrounding copy into the batch file.
## 1. On-image copy
- **Format first.** The on-image text fills the slots its source sets (`../make-static-ads/references/levels.md`): the template's text slots at close and balanced, the brand's own ad style at bold. Match slot count, length, case and voice.
- **Headline:** names the relationship in the picture, in words this brand would use ("Mum has notes."). Not the feature, not the effect. Up to about eight words, two lines on a phone.
- Write 3 candidates per ad, from different formulas: a situation call-out, a contrarian opinion with proof, a specific number, the buyer's own question answered with a usable fact, customer words (attributed), old worry vs now, a founder line, an instruction. Keep the one that makes the picture land fastest; say in one line what the runner-up loses. Keep the spares for copy variants. Never a question about the viewer's personal traits (Meta).
- **Other slots** (support line, list items, label, button): only if the source has them, in short words. A factual line must be a usable fact worded as recorded (`../make-static-ads/references/claims-and-policy.md` §2). A fact with no slot goes in the primary text.
- **No footer brand name:** the brand name is never drawn as text; the placed logo carries the brand. A tagline only when the template has a slot for it and the brand has one.
## 2. Copy around the image
View the complete source on GitHubmake-static-ads-claims-extract
When your agent uses it
Step of the make-static-ads playbook: pulls every claim-bearing span out of an ad — the copy around the image, the on-image words in the prompt, badges, and what the picture implies — and keeps or cuts each by the brand-brain rule. Runs before spend on the finished prompt (Pass A) and on every render (Pass B). Run make-static-ads instead; not for direct use.
What it loads into context
Frontmatter
109 tokensAlways available to the agent
SKILL.md
762 tokensWhen the skill is activated
Reference documents
6,113 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
../claims-gate/SKILL.mddoc15,033 bytesSKILL.mdcore3,014 bytesskill.meta.jsonasset530 bytes../make-static-ads-compose/SKILL.mddoc2,758 bytes../make-static-ads/references/claims-and-policy.mddoc7,033 bytes
Read SKILL.md
# claims-extract
Every factual line in an ad is a usable fact or is cut (`../make-static-ads/references/claims-and-policy.md` §2, which applies the `claims-gate` skill). This atom is the static-ad extract step.
**Reads:** the copy (the `make-static-ads-ad-copy` skill); each ad's finished prompt (the `make-static-ads-compose` skill) for Pass A, or its renders for Pass B; the claims contract loaded at Step 1 (`../claims-gate/SKILL.md` §1); `../make-static-ads/references/claims-and-policy.md` §1–2 (what counts, trigger words, the four doors, offers); the product record and real label text.
**Writes:** per ad, the span list with a verdict per span; the per-ad result and the cut list (hand-off and batch file).
1. **Pass A — extract** from each ad before any quote: primary texts, link headline, description, CTA, destination; from the prompt, every on-image word it asks the model to draw (headline, support line, badge, sticker, quote) and what its scene implies (before/after pairs, glow "results", lab coats, seals, a picture that says the product replaces other products); offer terms.
2. **Pass B — what the model drew:** read the render (by eye, or its automatic read) for words it added or changed, invented "#1", stars, seals, laurels, prices, a badge carried over from a reference, dropped qualifiers and garbled text.
3. **Verdict per span** by the usable-fact rules (`claims-and-policy.md` §2): keep it as recorded, keep it only as a quoted and attributed line, or cut it with what would confirm it. Use the trigger words there to spot spans; a shortened, merged or reworded claim is a new claim (rewording: `../claims-gate/SKILL.md` §1.7).
4. **A cut on-image line → rewrite** that ad's copy and prompt (the `make-static-ads-compose` skill (`../make-static-ads-compose/SKILL.md`)) around usable facts only; the cut words never appear in the new prompt. A scene that implies the cut claim changes too. Then run Pass A again. A cut copy line → ad-copy rewrites it.
5. **Offers, prices, stock:** as `../make-static-ads/references/claims-and-policy.md` §2 says. A translated ad is a new ad for this check.
6. **A claim the marketer confirms in this chat** counts only as the `claims-gate` skill's sign-off records it (`../claims-gate/SKILL.md` §4).
View the complete source on GitHubmake-static-ads-compose
When your agent uses it
Step of make-static-ads: writes each ad's render prompt and ordered image list from its concept-board row, one per ad and ratio, ready for a quoted render. Run make-static-ads instead; not for direct use.
What it loads into context
Frontmatter
68 tokensAlways available to the agent
SKILL.md
693 tokensWhen the skill is activated
Reference documents
6,983 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore2,758 bytesskill.meta.jsonasset531 bytes../make-static-ads/SKILL.mddoc14,292 bytes../make-static-ads/references/formats-and-placements.mddoc2,261 bytes../make-static-ads/references/levels.mddoc4,320 bytes../make-static-ads/references/prompts.mddoc7,852 bytes
Read SKILL.md
# compose
**Read first:** `../make-static-ads/references/prompts.md`.
**Reads:** the `board.md` row with its final copy, level and template; `profile.md` (the brand's real look); `../make-static-ads/references/levels.md`; the product record and photos, the logo, the brand kit's colours and fonts, every `must` and `dont` rule.
**Writes:** per ad and ratio, the exact prompt and `image_urls` into the batch file, the template it is based on as `template_id` (its id from `ads_template_read`) or, with no id, as `reference_image_url` (the template's public image URL), never both, so the app shows "Based on" (this only records it; the image still goes in `image_urls` when `levels.md` says so), a `title` ("<brand> — <headline> (<level>)"), plus a `render-<ad>-<ratio>.json` holding the `gooseworks:ads_render` arguments on a host with files.
1. **Product images.** Pick the official photo(s) that show the label most clearly from the angle the scene needs; for software, real UI screenshots or the mascot, never the logo (`../make-static-ads/SKILL.md`, Before you start). Public https URLs only; a local or attached file goes through `gooseworks:media_upload` first. Look at each one before using it.
2. **Shared foundation.** Write it once for the batch (`prompts.md` §2) with the brand's look from `profile.md`, its fonts and rules. Reuse it word for word.
3. **Style, layout and scene.** For each ad, write `prompts.md` §3 from the board row: its own style, the template's layout as the level keeps it, then the scene. Leave the logo area clear (no shell and a drawn logo chosen: attach the logo instead), and attach images as `prompts.md` §1 says. The physical event and the protected choice go in as concrete sentences; the protected choice also appears word for word.
4. **Copy.** Every word to be drawn is in quotes, exactly as the board has it, placed in its slot. Nothing else is asked to be drawn.
5. **Ratios.** One prompt per ratio the placements need (`prompts.md` §4, `../make-static-ads/references/formats-and-placements.md`).
6. **Read it back** (`prompts.md` §5). Then hand it to the claims check.
Engine: leave `engine` unset (the default) unless the marketer asked for another or the default refused the content. A prompt with no attached images stays on the default engine. A changed prompt after the claims check goes through the check again.View the complete source on GitHubmake-static-ads-concept-grid
When your agent uses it
Step of make-static-ads: turns the chosen angles into messages, visual ideas and a template per ad, checks each against the brand profile and recent ads, writes the concept board and has a fresh critic attack it before any copy, prompt or spend. Run make-static-ads instead; not for direct use.
What it loads into context
Frontmatter
86 tokensAlways available to the agent
SKILL.md
1,556 tokensWhen the skill is activated
Reference documents
8,266 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Angle
- 2. Message
- 3. Visual idea
- 4. Style
- 5. Template
- 6. Tests
- 7. Choose the set
- 8. Write the board
- 9. The critic
Files
SKILL.mdcore6,380 bytesSKILL.mdcore6,380 bytesskill.meta.jsonasset279 bytes../make-static-ads-find-references/SKILL.mddoc4,894 bytes../make-static-ads/SKILL.mddoc14,292 bytes../make-static-ads/references/handoff-format.mddoc4,451 bytes../make-static-ads/references/ideas.mddoc6,629 bytes../make-static-ads/references/levels.mddoc4,320 bytes
Read SKILL.md
# concept-grid
**Read first:** `../make-static-ads/references/ideas.md` §1–4 (§1 the failure and what a demonstration is; §2 the method, whose A is the material for step 2 below; §3 the tests; §4 two short examples), `../make-static-ads/references/levels.md` (what each creativity level keeps from the template). This step is the order of work.
**Reads:** `profile.md` and what Step 1 found (product facts, customer words, history); the angles and level chosen in Step 2.
**Writes:** `board.md` in the batch folder `ads/batches/<YYYY-MM-DD>-<slug>/` (on a host with no files, in the batch file).
The order is fixed: **angle → message → visual idea → style → template.** The template never decides the message.
## 1. Angle
Each ad starts from the angle chosen in Step 2: one of the profile's angles, or a marked new one (the cap: `../make-static-ads/SKILL.md` Step 2). Several ads may share an angle; they then need different messages.
## 2. Message
View the complete source on GitHubmake-static-ads-copy-variants
When your agent uses it
Step of the make-static-ads playbook: after an image is approved, makes more versions of the same picture with different hooks, headlines or fonts by a quoted re-render with the approved render attached as the brand's own image, so copy can be tested without new visuals. Offered, never default. Run make-static-ads instead; not for direct use.
What it loads into context
Frontmatter
96 tokensAlways available to the agent
SKILL.md
696 tokensWhen the skill is activated
Reference documents
5,659 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
../make-static-ads-claims-extract/SKILL.mddoc3,014 bytes../make-static-ads-compose/SKILL.mddoc2,758 bytesSKILL.mdcore2,825 bytesskill.meta.jsonasset567 bytes../make-static-ads-render-review/SKILL.mddoc6,583 bytes../make-static-ads/references/fonts-and-color.mddoc2,534 bytes../make-static-ads/references/prompts.mddoc7,852 bytes
Read SKILL.md
# copy-variants
**When to offer:** as a **hook test on a winner** — after the review (Step 8), for the one or two images the marketer likes most, or later on an ad with results, or when the marketer asks "same image, different text" or "try another font". Say plainly: these test **copy**, not **concepts** — Meta treats the same picture with new words as nearly the same ad, so they go in the same ad (as extra text options), never as new concepts.
No new board: the parent ad's row is the basis, linked in the batch file. Every new line goes through the claims check before its quote.
**Reads:** the approved render (`gooseworks:ads_creative_read` `creative_id`, `include: ["renders"]`); the ad's spare hooks from the `make-static-ads-ad-copy` skill; the parent ad's board row and prompt; `../make-static-ads/references/fonts-and-color.md`; `../make-static-ads/references/prompts.md`.
**Writes:** variant renders, each with its text and font in the batch file under the parent ad.
1. **Pick the variants:** 2–4 hook directions from the parent's spare hooks for the same reason to buy (different hook formulas); optionally 2–3 font treatments from `fonts-and-color.md`, in the brand's colours. A new font goes into the prompt's typography line.
2. **Write each variant's prompt** with the `make-static-ads-compose` skill (`../make-static-ads-compose/SKILL.md`). Images in order: the product photo first, then the parent's raw render without the logo ("Image 2 is our approved ad: keep its scene exactly; change only the words in <slot> to …"). Then `gooseworks:ads_render` `dry_run: true`, the quote as given, the marketer's yes, submit. The picture may shift slightly. The layer split (`ads_creative_layerize`) is not used: it returns no price before it charges.
3. **Check each variant:** Pass A and B of the `make-static-ads-claims-extract` skill (`../make-static-ads-claims-extract/SKILL.md`); then the `make-static-ads-render-review` skill (`../make-static-ads-render-review/SKILL.md`): the logo placed again, the judge with rubric checks 2, 8, 11, 15 and 23, you with 1 and 12 (its step 3), one retry inside the yes.
4. **Hand over** each variant under its parent ad: the image, its text, its font. Suggest running them as text options inside one flexible ad, not as separate concepts.
View the complete source on GitHubmake-static-ads-find-references
When your agent uses it
Step of make-static-ads: picks a template for every ad in its chosen style, after its visual idea and style are set, from the brand's own ads, the GooseWorks library or category leaders, and records what the chosen creativity level keeps from it. Run make-static-ads instead; not for direct use.
What it loads into context
Frontmatter
88 tokensAlways available to the agent
SKILL.md
1,122 tokensWhen the skill is activated
Reference documents
3,457 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Where to look (free first), in this order
- 2. Choose the template after the idea
- 3. Record what this level keeps (`levels.md`)
- 4. Rights
- 5. Showing them
Scripts executed separately
../make-static-ads/scripts/template_sheet.py
Files
SKILL.mdcore4,894 bytesSKILL.mdcore4,894 bytesSKILL.mdcore4,894 bytesSKILL.mdcore4,894 bytesskill.meta.jsonasset241 bytes../make-static-ads/references/brand-profile.mddoc4,993 bytes../make-static-ads/references/handoff-format.mddoc4,451 bytes../make-static-ads/references/levels.mddoc4,320 bytes../make-static-ads/scripts/template_sheet.pyruns3,804 bytes
Read SKILL.md
# find-references
**Reads:** each board row's angle, message, visual idea and style; the chosen level (`../make-static-ads/references/levels.md`); `profile.md`. **Writes:** the Template column of `board.md` and a short template list under the board (source, its template id from `ads_template_read` when it has one (library or the brand's own imported ad), page link, the image's public https URL (a brand's own ad from a page or file goes through `gooseworks:media_upload` first), whether its image goes to the model at this level, and what it keeps).
Every ad has a template. Without one the image model falls back on its own default layout, and every brand's ads end up looking the same. A template is a finished ad with a layout: text slots, blocks, a background treatment. A plain product photo or lifestyle shot is not a template; it is a style reference at most.
## 1. Where to look (free first), in this order
1. **The brand's own ads** (its past and running statics, from `profile.md`). They already look like the brand (whether their image may go to the image model: `../make-static-ads/references/levels.md`).
2. **The GooseWorks template library:** `gooseworks:ads_template_read` `mode: "static_library"` with a query for the layout or device the visual idea needs. Open each candidate's detail and look at the image. Name a library source as such, never as a verified running ad.
3. **Category leaders and inventive brands from other categories** in the Meta Ad Library, in the host browser (routes in `../make-static-ads/references/brand-profile.md` §1): the first 20 or so statics of 2–3 advertisers.
Each set uses at least one template from outside the GooseWorks library (the brand's own ads, a leader, or another category's inventive brand). If none of those can be opened, say which you tried on the board.
View the complete source on GitHubmake-static-ads-fix-rejected
When your agent uses it
Step of the make-static-ads playbook: fixes a static image ad the platform rejected — finds the ad, maps the platform's reason to the line or element at fault, fixes copy for free or re-composes the image text on a quote, re-runs the claims and policy checks, and answers the request. A rejected video is the video playbook's job. Run make-static-ads instead; not for direct use.
What it loads into context
Frontmatter
112 tokensAlways available to the agent
SKILL.md
719 tokensWhen the skill is activated
Reference documents
7,941 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
../ad-policy-check/SKILL.mddoc7,058 bytes../make-static-ads-ad-copy/SKILL.mddoc3,078 bytes../make-static-ads-claims-extract/SKILL.mddoc3,014 bytes../make-static-ads-compose/SKILL.mddoc2,758 bytesSKILL.mdcore2,771 bytesskill.meta.jsonasset589 bytes../make-static-ads-render-review/SKILL.mddoc6,583 bytes../save-learning/SKILL.mddoc9,842 bytes
Read SKILL.md
# fix-rejected
Runs in place of the playbook's steps: no new board. The rejected ad's board row and prompt (in its batch file) are the basis; keep its idea and change only what the rule requires.
**Reads:** the open `Fix needed: for make-static-ads` line in `ads/campaigns/<slug>/rotation-requests.md` and the health line of `ads/campaigns/<slug>/state.md` (`gooseworks:file_read`), or, asked in chat, the ad and the platform's exact reason (ask for both if missing); the creative (`gooseworks:ads_creative_read` by tag, or `gooseworks:ads_template_read` `mode: "mine"`); its batch-file entry.
**Writes:** the fix in the batch file under the ad; a `Fix ready:` answer under the request line (re-read the file, insert, write the whole file back with `gooseworks:file_write`).
1. **Find the ad** and read its copy, its on-image text, its board row and its prompt.
2. **Map the reason** to the exact line or element at fault (the `ad-policy-check` skill (`../ad-policy-check/SKILL.md`)).
3. **Fix it:**
- The fault is in the copy around the image → rewrite that line (the `make-static-ads-ad-copy` skill (`../make-static-ads-ad-copy/SKILL.md`)). Free.
- The fault is in the image → rewrite its prompt with the `make-static-ads-compose` skill (`../make-static-ads-compose/SKILL.md`): the same scene with the faulty line or element changed. Images in order: the product photo first, then the rejected ad's raw render without the logo, to keep the look. Run step 4's checks on the new prompt, then `gooseworks:ads_render` `dry_run: true`, the quote as given, the marketer's yes, submit, and the `make-static-ads-render-review` skill (`../make-static-ads-render-review/SKILL.md`), which places the logo again.
- Nothing in the ad breaks the rule → say so and suggest asking the platform for a review.
4. **Re-run both checks** on the fixed copy or prompt before any quote, and on the new render after it: the `make-static-ads-claims-extract` skill (`../make-static-ads-claims-extract/SKILL.md`) and `ad-policy-check`.View the complete source on GitHubmake-static-ads-graphic-request
When your agent uses it
Makes one simple non-ad brand graphic, such as an email header, social feed or story image, or a blog or link-preview image, in the brand's style with at most a short line of text, after claim and rights checks and a yes to the quote; returns the link and alt text. Not for carousels, decks or print. Use alone when you already have the purpose, placement and exact wording; otherwise run make-static-ads.
What it loads into context
Frontmatter
123 tokensAlways available to the agent
SKILL.md
1,181 tokensWhen the skill is activated
Reference documents
11,662 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
../ad-policy-check/disclosure.mddoc3,120 bytes../claims-gate/SKILL.mddoc15,033 bytes../make-static-ads-claims-extract/SKILL.mddoc3,014 bytes../make-static-ads-compose/SKILL.mddoc2,758 bytesSKILL.mdcore4,593 bytesskill.meta.jsonasset614 bytes../make-static-ads-render-review/SKILL.mddoc6,583 bytes../make-static-ads/references/engine-notes.mddoc3,503 bytes../make-static-ads/references/formats-and-placements.mddoc2,261 bytes../make-static-ads/references/handoff-format.mddoc4,451 bytes../spend-gate/SKILL.mddoc6,102 bytes
Read SKILL.md
# graphic-request
No concept board: the request's purpose and exact text are the basis. Record both in the batch file.
**Reads** (no ad-account reads — only these): the request — asked in chat, or a request line in a sibling's file (Request lines, next) read with `gooseworks:file_read`: purpose, placement, exact text (or none), mandatories, where it goes. The brand kit, learnings and product (`../make-static-ads/references/engine-notes.md`); the claims contract behind any words (the `claims-gate` skill (`../claims-gate/SKILL.md`) §1).
**Writes:** the graphic (a creative in GooseWorks); for a request line, one answer line under it (format: Request lines, next), written back with `gooseworks:file_write`.
**Request lines.** Requests arrive as `Graphic needed: for make-static-ads · <purpose, placement, exact text> · return to: <path>` lines (open = no `Graphic ready:` line under it), in:
- email-lifecycle's `lifecycle/flows/<flow-slug>.md` (header art for a flow message);
- run-organic-social's `social/calendar/<start-date>.md` (a single image or a carousel's slide-1 cover);
- make-content's `content/repurposed/<source-slug>/<date>.md` and `content/drafts/<date>-<slug>.md`.
Older files may still carry a `Header art needed:` line or a plain asset line naming this side door — treat it the same way.
Answer under the request (re-read the file, insert, write it all back): `Graphic ready: <link> · <YYYY-MM-DD> · alt: <text> · <ratio> · claims: <ok / cut …>`. The requester reads it on its next run.
View the complete source on GitHubmake-static-ads-render-review
When your agent uses it
Step of make-static-ads: a fresh judge checks every render against its concept-board row and the official product photos, one retry inside the marketer's approval, then the claims and set checks; records each verdict in tags and the batch file. Run make-static-ads instead; not for direct use.
What it loads into context
Frontmatter
83 tokensAlways available to the agent
SKILL.md
1,645 tokensWhen the skill is activated
Reference documents
6,729 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Scripts executed separately
../make-static-ads/scripts/place_logo.py../make-static-ads/scripts/repair_patch.py
Files
../honest-review/SKILL.mddoc3,611 bytes../make-static-ads-claims-extract/SKILL.mddoc3,014 bytesSKILL.mdcore6,583 bytesskill.meta.jsonasset531 bytes../make-static-ads/references/claims-and-policy.mddoc7,033 bytes../make-static-ads/references/handoff-format.mddoc4,451 bytes../make-static-ads/references/review-rubric.mddoc6,767 bytes../make-static-ads/scripts/place_logo.pyruns3,677 bytes../make-static-ads/scripts/repair_patch.mddoc2,526 bytes../make-static-ads/scripts/repair_patch.pyruns9,239 bytes
Read SKILL.md
# render-review
Shared principles for reviewing generated media (looking vs reading metadata, unseen images): the `honest-review` skill (`../honest-review/SKILL.md`). Checks and their severities: `../make-static-ads/references/review-rubric.md`. This file is the one home of the retry rule.
**Reads:** each render (`gooseworks:ads_creative_read` `creative_id`, `include: ["renders"]`), its board row (level, style and template), its exact prompt and copy, `profile.md` with two of the brand's own ads, the official product photos or UI screenshots, and the logo.
**Writes:** per render the verdict and the failed checks; retries; the drop list; tags; all of it in the batch file.
0. **Failed or empty render.** Say so in one line. Read the job (`gooseworks:job_get`): charged, or no charge shown → it counts as this ad and ratio's first try; its one retry (step 5) is still covered; clearly uncharged → submit the same quoted request once more, outside the retry. If that fails too, stop for that ad and ratio and tell the marketer.
1. **Place the logo on every try** (unless the marketer said none; then, as with no shell, the raw render is the kept version): on a shell host run `../make-static-ads/scripts/place_logo.py` with the real logo file (corner and width as the prompt left clear), upload the result with `gooseworks:media_upload` (`scope: "brand"`, `kind: "image"`, `source: {type: "bytes"}`, base64, under 8 MB), and `gooseworks:ads_save` it with the raw render's creative as `parent_creative_id`. This logo version is what the judge sees, what gets the tags, and what the marketer receives; tag the raw render `superseded`. Record the box the script prints. No shell: the marketer's choice (playbook Step 2, or graphic-request step 3): a clear corner they fill, or the model's logo; the raw render is then the kept version.
2. **The judge.** A fresh subagent gets only: the kept version (step 1), the product photos or screenshots and logo, the exact on-image copy, the board row's visual idea, style, protected choice, level, and the template's image with its description, `profile.md` with two of the brand's own ads, and the rubric. Not the conversation. It runs every rubric check except 1, 7, 12, 17, 19, 20, 21 and 29, and returns each failed check's number and severity with one sentence each. It works in the rubric's Order. For software, the screen must match the real screenshot in layout, colours and its large labels; soft small UI text is a NOTE, never a retry. No subagents → you judge from exactly those inputs, and the batch file says so.
3. **Your checks**, on every try: 1 by Pass B of the `make-static-ads-claims-extract` skill (`../make-static-ads-claims-extract/SKILL.md`: invented badges, stars, prices, changed words); 7 by the price rule (`../make-static-ads/references/claims-and-policy.md` §2); 21 against the copy (12 and 17 ran at the copy step; re-run them only on changed copy); 20 against the permissions on file; 29 against the made-before list; for a direct competitor's template, 22's side-by-side with both logos covered.
4. **Verdict**, in this order:
- Label drift only (scene, shape and pose pass): the free repair first. A shell host may patch the official label's real pixels in with `../make-static-ads/scripts/repair_patch.py` (`../make-static-ads/scripts/repair_patch.md`), then judge the patched image again in full; keep the original render. A seam, altered geometry or wrong product still fails.
- A stray mark or small artifact outside the protected choice and the words: a free pixel fix on a shell host, then judged again in full.View the complete source on GitHubmarketing-data-access
When your agent uses it
How to get live public data (ads libraries, social posts and comments, search results, creator profiles), business identity/work-contact reads, domain SEO metrics and paid media generation through GooseWorks, with no vendor key. Load before any playbook step that reads public data or calls an outside model: which proxy call fits the job, what it costs, how to get the human's yes, and what to do when the data is not reachable. Not for brand facts (read the brand brain) or the customer's own ad accounts (the GooseWorks ads tools, or an ads connector they have).
What it loads into context
Frontmatter
147 tokensAlways available to the agent
SKILL.md
1,910 tokensWhen the skill is activated
Reference documents
9,111 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- A focused data request
- Managed marketing data
- Raw provider calls
- Which ScrapeCreators read fits the job
- Free sources that need no proxy
- Money rules
- Never
- When the data is not reachable
Files
SKILL.mdcore7,955 bytesSKILL.mdcore7,955 bytesfocused-reads.mddoc3,436 bytesskill.meta.jsonasset626 bytes../marketing-guide/SKILL.mddoc17,316 bytes../spend-gate/SKILL.mddoc6,102 bytes../spend-gate/proxy-endpoints.mddoc9,816 bytes
Read SKILL.md
# marketing-data-access
One door to outside data and models: the GooseWorks proxy. The customer never needs a vendor account or key, and GooseWorks bills the calls in credits.
## A focused data request
For a post list, engagement ranking or voices list, read [focused-reads.md](focused-reads.md), then return the requested data without a full marketing report or calendar. Use only the relevant endpoint reference; preserve dates, exact measures and coverage.
## Managed marketing data
When the current tool list includes `marketing_data_describe` and `marketing_data_lookup`, use them for curated people/company search and enrichment, work-email finding/verification, LinkedIn post engagers and domain SEO metrics. Describe is free and returns current operation schemas. Lookup defaults to a free quote: preserve the request, show the quoted maximum credits, obtain approval through spend-gate branch A, then execute with its request-bound quote token and approved ceiling. Read the actual result and charge before claiming coverage. Operations differ: total visits are not organic traffic, a finder is not an email check, and post counts are not people who engaged. For paginated LinkedIn results, preserve the returned continuation token and follow the live schema; do not start later pages as new searches or invent a provider receipt. Read every partial-failure receipt and cost before deciding whether to retry. No arbitrary vendor paths, personal email or phone lookups.
If these tools are absent, use public pages, an existing read-only connector or a supplied export and label missing fields. Do not tell the customer to obtain vendor keys.
View the complete source on GitHubmarketing-guide
When your agent uses it
How every GooseWorks marketing playbook runs: connecting, picking the brand, where files go, the shared claims, money, research and schedule rules, and the index of what each playbook saves and who reads it. Load at the start of any playbook run. Not a marketer ask: for "what should I do first?" use where-to-start.
What it loads into context
Frontmatter
95 tokensAlways available to the agent
SKILL.md
4,369 tokensWhen the skill is activated
Reference documents
16,180 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Connect and pick the brand
- 2. Where files go
- 3. The rules every playbook shares
- 4. What each playbook saves, and who reads it
- 5. Local mode (no GooseWorks)
Files
../claims-gate/SKILL.mddoc15,033 bytes../marketing-data-access/SKILL.mddoc7,955 bytesSKILL.mdcore17,316 bytesresearch-pattern.mddoc1,828 bytesskill.meta.jsonasset732 bytes../run-memory/SKILL.mddoc18,060 bytes../save-learning/SKILL.mddoc9,842 bytes../save-to-brain/SKILL.mddoc6,868 bytes../spend-gate/SKILL.mddoc6,102 bytes
Read SKILL.md
# marketing-guide
Every playbook does the same setup and follows the same rules. They live here once.
**Other skills.** A playbook, its steps and these shared rules are separate skills that sit side by side. "The `<slug>` skill (`../<slug>/SKILL.md`)" names one: with files, read that path; in a chat app without files, fetch it from the GooseWorks catalog by its slug (`gooseworks:catalog_fetch`, type `skill`, slug `<slug>`; add `path` for a file inside it, such as `references/<file>.md`). The skills a playbook needs are listed as its dependencies and come with it.
## 1. Connect and pick the brand
1. **Connected?** If no `gooseworks:` tools are listed, call `gooseworks:tools_load` once for the group you need. Still none → a playbook with **local mode** says once "GooseWorks isn't connected, so I'll keep this brand's notes in this folder and you'll approve each change here." (no last clause if it changes nothing) and follows §5; any other says only "Connect GooseWorks first — I <do this job> through it." and stops. Never half-run.
2. **First GooseWorks call of the conversation:** `gooseworks:get_started` with the marketer's own words. Its answer settles setup, and the brand only when the marketer named it; the playbook's gates decide the rest.
3. **Which brand?** `gooseworks:brand_read` lists the brands. One brand → use it. Several and none named → ask which, by name, before any research; never default to one. Keep the brand's `coworker_agent_id`.
4. **Read the brain before asking anything.** Ask only what the brain and the public site cannot answer.
- **Brain tools.** The Brand Brain tools are `brand_knowledge_browse`, `brand_knowledge_search`, `brand_knowledge_read` and `brand_knowledge_save`. Their presence means the brain path (claims excepted: the `claims-gate` skill decides). Never request `brand_read`'s `sources` section in a routine read: it can pass 100K characters.
- **When `brand_knowledge_*` tools are listed** (the Brand Brain), start with `gooseworks:brand_knowledge_browse`: the rules, the never-list, the items **waiting for the marketer's yes**, and the chapters' "read when" hints. Open the chapters the task needs and its `required_reads` (`brand_knowledge_browse` `kind` or `gooseworks:brand_knowledge_read`); `gooseworks:brand_knowledge_search` for gaps.View the complete source on GitHuboutcomes-ledger
When your agent uses it
Shared step of the marketing playbooks (research-audience, write-outreach, work-with-creators): keeps the brand's record of the prospects or creators that were handed over. Tracks a status for each person, permanent opt-outs, re-check dates and dated lessons, which the next run reads. Loaded by those playbooks; not for direct use.
What it loads into context
Frontmatter
95 tokensAlways available to the agent
SKILL.md
2,666 tokensWhen the skill is activated
Reference documents
5,622 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Parameters (the loading playbook sets them)
- Files and scope
- On every run (before any new sourcing)
- Lessons (only when outcomes came back)
- With run-memory (the `run-memory` skill)
- Suppression without personal data
- Retention
- Never
Files
SKILL.mdcore11,207 bytesskill.meta.jsonasset445 bytes../save-learning/SKILL.mddoc9,842 bytes../save-to-brain/SKILL.mddoc6,868 bytes../spend-gate/SKILL.mddoc6,102 bytes
Read SKILL.md
# outcomes-ledger
Every list a playbook hands over gets acted on outside GooseWorks: the human emails the prospects, messages the creators. This atom is how what happened comes back, so the next run never repeats a person who said no and gets better from what worked. It never contacts anyone and never requires outcomes: no outcomes, carry on.
## Parameters (the loading playbook sets them)
| | `entity: person` | `entity: creator` |
|---|---|---|
| Loaded by | research-audience (writes rows when a list is shown), write-outreach (updates statuses from replies and results) | work-with-creators |
| Ledger file | `research/audience/ledger.csv` | `creators/roster.csv` |
| Lessons document (file → brand document) | `research/audience/lessons/<YYYY-MM-DD>.md` → `Outreach lessons — <Brand> — <YYYY-MM-DD>` | `creators/lessons/<YYYY-MM-DD>.md` → `Creator lessons — <Brand> — <YYYY-MM-DD>` |
| Entity columns (after the required ones) | `segment, tier, value_tier, signal_type, email_status, region_flag, email, email_candidate, profile_url, root_domain, route, sequence_id, opener_id, first_touch_date, last_touch, reply_category, recontact_after` | `role, tier, deal_structure, vetting_depth, wave, wave_criterion, wave_result, quoted_rate`, then the roster's own columns |
| Status values | `listed · contacted · replied · meeting · not-a-fit · bounced · unsubscribed · do-not-contact` | `shortlisted · contacted · replied · quoted · declined · signed · posted · never-again` |
| Suppressing statuses (permanent) | `bounced · unsubscribed · do-not-contact` | `never-again` |View the complete source on GitHubplan-campaign
When your agent uses it
Campaign planner: turns a product, offer, goal, budget and date into a plan the marketer can approve and a designer can start from today, with every channel kept or dropped for a reason. Zero paid is a valid answer; it never spends. Use when the ask names a campaign, a launch, drop or season push, a budget or a date: I have this budget and a launch date — what do I run, where?; plan my launch, drop or Black Friday push; plan a campaign; how should I split $5k; plan next month's campaign; our CAC blew up — replan. Not for a broad "grow my brand", "get more customers" or "where do I start" with no campaign, budget or date — use where-to-start; not for pausing ads on a sold-out product — use run-paid-campaigns; not for an email-only send plan — use email-lifecycle; not for reading this week's numbers — use analyze-performance.
What it loads into context
Frontmatter
235 tokensAlways available to the agent
SKILL.md
3,716 tokensWhen the skill is activated
Reference documents
38,643 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
../marketing-guide/SKILL.mddoc17,316 bytes../plan-campaign-brief-and-assets/SKILL.mddoc2,973 bytes../plan-campaign-budget-and-tests/SKILL.mddoc1,617 bytes../plan-campaign-channel-decision/SKILL.mddoc1,910 bytes../plan-campaign-goal-chain/SKILL.mddoc2,485 bytesSKILL.mdcore15,899 bytesSKILL.mdcore15,899 bytesSKILL.mdcore15,899 bytesSKILL.mdcore15,899 bytesreferences/brief-template.mddoc15,304 bytesreferences/budget-and-tests.mddoc7,739 bytesreferences/channel-decision.mddoc11,410 bytesreferences/company-types.mddoc8,251 bytesreferences/intake.mddoc8,564 bytesreferences/launch-and-calendar.mddoc5,331 bytesreferences/replan.mddoc4,253 bytesreferences/run-memory.mddoc11,557 bytesreferences/unit-economics.mddoc10,562 bytesskill.meta.jsonasset5,994 bytestests/test-by-hand.mddoc10,724 bytes../run-memory/SKILL.mddoc18,060 bytes../save-to-brain/SKILL.mddoc6,868 bytes../spend-gate/SKILL.mddoc6,102 bytes../write-report/SKILL.mddoc8,986 bytes
Read SKILL.md
# plan-campaign
## What you get
A **campaign plan** the marketer reads in 30 seconds and a designer can start from today, written and delivered through the `write-report` skill (`../write-report/SKILL.md`): a clickable file, a copy saved to the brand, and the same text on the GooseWorks campaign record (local mode: a copy in this folder, no campaign record). It opens with **In short** (what the plan rests on; the goal and whether the money gets there; which channels the plan covers and why; where we run and where we don't; the split; the first test; then "do this first, because of …" — what's needed this week), then Decisions for you, the story, What to do (at most six moves) and What we're not doing — with the long working tables in an appendix (`references/brief-template.md`): who it's for and what we say, the money math and forecast, channel decisions, budget split, paid structure, tests, angles per channel, offer, backwards calendar, asset list, how we'll measure it, hand-offs, replan triggers, what we couldn't check.
## Before you start
1. **Setup first:** do the `marketing-guide` skill (`../marketing-guide/SKILL.md`) §1–2 (connect, brand, brain read) before anything else; the job line is "plan your campaign". This playbook offers **local mode** (marketing-guide §5): plan from the live site, the marketer's answers and their connectors (read-only), and save the plan in the local `plans/<slug>/` in place of the campaign record; it skips every `gooseworks:` call from the look-first pass (`references/intake.md` § 1, local mode) through write-back (`references/brief-template.md` § Write-back, local mode). With GooseWorks, load the campaigns, meta, social and files groups in one `gooseworks:tools_load`.
2. **Look first — ask nothing yet.** Do `references/intake.md` §1 in full before the first message: the brain chapters a plan needs, what's connected, what's already planned or measured, the research, the last plan and how its bets did (run-memory's Start steps, job `campaign plan`, subject the campaign slug — `references/run-memory.md`), the claims contract and the live site (required every run).
3. **Then one short message, like a person would ask** — `references/intake.md` §2 is the single source for its shape and wording: what you found in two or three lines, then at most four plain questions, product and offer first. Only the product, audience, goal, budget and date block planning; everything else becomes a labelled assumption (`references/intake.md` §3).
4. **A goal that isn't a number** ("make it big", "as many installs as possible"): offer 2–3 concrete options built from the brand's own numbers and the budget (metric + target + date), steering vanity metrics to the one the business needs. The marketer picks; you never set it.
5. **Research missing?** If the customer-words bank or the angle bank is missing, say so in one line and offer to do that research first; if the marketer wants to go ahead, angles are labelled "starting point". Public benchmarks for the money math may be looked up with web search and are labelled as such.
View the complete source on GitHubplan-campaign-brief-and-assets
When your agent uses it
Step of the plan-campaign playbook: writes angles per channel, the asset list, measurement plan, hand-offs and replan triggers, then assembles the plan. Run plan-campaign instead; not for direct use.
What it loads into context
Frontmatter
71 tokensAlways available to the agent
SKILL.md
705 tokensWhen the skill is activated
Reference documents
10,956 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
../claims-gate/SKILL.mddoc15,033 bytesSKILL.mdcore2,973 bytesSKILL.mdcore2,973 bytesskill.meta.jsonasset407 bytes../plan-campaign/references/brief-template.mddoc15,304 bytes../plan-campaign/references/launch-and-calendar.mddoc5,331 bytes../write-report/SKILL.mddoc8,986 bytes
Read SKILL.md
# Brief and asset list (atom)
**Load:** `../plan-campaign/references/brief-template.md`, `../plan-campaign/references/launch-and-calendar.md`, the `write-report` skill (`../write-report/SKILL.md`) (§1 writing rules, §3 check).
**Inputs:** all earlier sections; approved claims = the claims that are usable through the `claims-gate` skill (`../claims-gate/SKILL.md`) ("Claims sign-off" marker, "Claims you may use" `must` facts, dated Brand record; or confirmed brain claims), with server applicability from `knowledge_search` `["claim"]` + `product_id`; the angle bank and voc bank files (`research/competitors/angle-bank.md`, `research/audience/voc-bank.md`); existing campaign concepts; the brand voice from the kit.
**Do:**
1. Angles per Run/Test channel: one reason to buy each, resting on a named customer line and an exact approved claim (with id) whose `applicability` covers it (`brand`, or `product` for that product). `unknown` applicability is not brand-wide proof — the server refuses it on a concept; mark **needs proof (scope unconfirmed)**. Adapt the expression per channel. No approved proof → **needs proof**, never invented. Press quotes and the brand's own site copy are not customer words; if research-market's voice-of-customer bank is empty, say so.
2. Asset list: one numbered row per asset — leg, placement, spec (format, ratio, length), angle, message/hook, claim (verbatim), CTA → destination (with UTMs), producer role (static ads, video ads, photos, content, human; video ads and photos are made with the goose-video and goose-product-photos skills, or by a person in local mode — the hand-off roles in `../plan-campaign/references/brief-template.md`), due date (from the backwards calendar), dependency. Check the count against each paid leg's creative-volume need.
3. Measurement plan per leg: conversion event, UTM convention, promo code, attribution window, the store/CRM number it is judged on, blended MER target, "how did you hear" question.
4. Hand-offs: one row per leg, no silent legs; legs with no playbook are marked human-executed.
5. Replan triggers with thresholds and the action each starts.
6. Assemble the plan with the exact headings of the template, In short first; each section opens with its point in one sentence; plain words; no ids, codes, paths, tool or playbook names; every outside fact with its source and date. Fill every section or write "none — <reason>". Then run write-report §3's check.
View the complete source on GitHubplan-campaign-budget-and-tests
When your agent uses it
Step of the plan-campaign playbook: splits the budget across chosen channels, checks per-channel minimums, and writes the test plan and paid structure. Run plan-campaign instead; not for direct use.
What it loads into context
Frontmatter
68 tokensAlways available to the agent
SKILL.md
394 tokensWhen the skill is activated
Reference documents
1,825 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore1,617 bytesskill.meta.jsonasset236 bytes../plan-campaign/references/budget-and-tests.mddoc7,739 bytes
Read SKILL.md
# Budget split, test plan, paid structure (atom)
**Load:** `../plan-campaign/references/budget-and-tests.md`.
**Inputs:** Run/Test legs and their minimums; economics box; per-leg targets; the learnings log (`knowledge_search` `source_types: ["learning"]`) so no paid-for test is re-bought; the brief's calendar phases.
**Do:**
1. Lay out every budget line; ~70/20/10 proven/promising/experiments as the default shape (rule of thumb), 10–20% held reserve with its release rule. No proven channel → say the plan is mostly tests.
2. For each paid leg: $ and %, its learning minimum, clears yes/no. A leg that does not clear is cut, merged, moved to a higher-funnel event, or labelled directional.
3. Phase the spend (pre-launch / launch week / sustain, or by week).
4. Write tests: one variable, cells, $/cell, readable threshold, end date, primary business metric, Win / Lose / Unclear actions. Small budgets test big swings.
5. One paid-structure line per paid leg (objective/event, campaigns/ad sets, audience approach, budget type and amount, creative count, destination with UTMs, applied by GooseWorks levers or written instructions).
6. Reconcile: lines sum to the budget; leg spend ÷ expected CPA = leg target in the goal chain.
View the complete source on GitHubplan-campaign-channel-decision
When your agent uses it
Step of the plan-campaign playbook: marks each candidate channel Run, Test, Later or No with a brand-fact reason and founder hours. Run plan-campaign instead; not for direct use.
What it loads into context
Frontmatter
65 tokensAlways available to the agent
SKILL.md
440 tokensWhen the skill is activated
Reference documents
2,691 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore1,910 bytesskill.meta.jsonasset236 bytes../plan-campaign/references/channel-decision.mddoc11,410 bytes
Read SKILL.md
# Channel decision (atom)
**Load:** `../plan-campaign/references/channel-decision.md`.
**Inputs:** brand type and distribution footprint (where the product is sold); buyer groups and demand read (`research/audience/buyer-groups.md`, `research/market/demand.md`); landscape and where competitors invest (`research/competitors/landscape.md`, competitor files, `competitor_read` roster); the economics box and per-leg minimums; creative capacity (which makers and how much volume; past creative in `ads_creative_read`); tracking state; email list size; learnings log; the founder's hours; channels already committed or off-limits; existing campaign concepts (`campaign_read`).
**Do:**
1. Write every mandatory row, then the rows live for this brand type; one line "not relevant: <reason>" for conditional rows that are not.
2. For each row answer the seven lenses in your head; write the **deciding** reason in plain words with a brand fact, the evidence, how sure you are in words, and, unless kept, what would change it.
3. Prefer one or two channels done properly. A judgment-only Run becomes a Test. Novelty is never a reason. No default channel.
4. Mark execution per leg: GooseWorks levers (Meta objects it creates or pushes into) or written instructions / human hands. Add founder hours per leg; if the total exceeds what the founder has, cut a leg and say which.
5. Zero paid is allowed: state it in the paid rows with the numbers.
**Output:** the brief's `### Channel decisions` section and founder-hours line.View the complete source on GitHubplan-campaign-goal-chain
When your agent uses it
Checks whether a stated goal is reachable on a given budget: fills an economics box with a source on every number, subtracts the baseline, works out the implied cost per customer against history or labelled base rates, and flags when the goal needs renegotiating. Use alone when you already have the goal (metric, number, date), budget, order value, margin and baseline; otherwise run plan-campaign.
What it loads into context
Frontmatter
112 tokensAlways available to the agent
SKILL.md
567 tokensWhen the skill is activated
Reference documents
4,435 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore2,485 bytesSKILL.mdcore2,485 bytesskill.meta.jsonasset252 bytes../plan-campaign/references/company-types.mddoc8,251 bytes../plan-campaign/references/unit-economics.mddoc10,562 bytes
Read SKILL.md
# Goal chain and economics (atom)
**Load:** `../plan-campaign/references/unit-economics.md`, `../plan-campaign/references/company-types.md` (the brand's type).
**Inputs:** the goal (metric, number, date) as the marketer stated it; budget; AOV / ARPA / first-job value; margin or contribution inputs; repeat behaviour if shown; baseline for the same period (marketer or past reports); conversion rates from the brand's history (learnings, past performance reads) or labelled base rates; stock or capacity.
**Do — part 1 (step 2):**
1. Fill the economics box. Every line gets a source: *own history · marketer · base rate (rule of thumb) · assumption*. Unknown margin → a labelled assumption with "confirm margin" first in What we couldn't check (asked only when the plan turns on it).
2. Baseline → incremental target (never credit the campaign for the baseline); implied CAC = budget ÷ incremental target vs history or labelled base rates; stock or capacity vs the goal. Pre-revenue: no allowable CAC — record the marketer's provisional cap.
**Do — part 2 (step 5, after the channels and split exist):**
3. Break the incremental target into per-leg targets with the chain that produces each (list × conversion; spend ÷ CPA; codes from creators), each with a "readable by" date.
4. Run conservative / expected / optimistic using the low / middle / high end of each assumption.
5. Check the forecast against stock (days of cover, inbound) or capacity (open slots).
6. If the expected scenario misses: write the renegotiation case (gap in numbers; what more budget, more time, a smaller goal or a different goal metric each buys; one recommendation). Return it to the playbook to show the marketer before planning further.View the complete source on GitHubresearch-audience
When your agent uses it
Audience research: who the buyers are, in their own words, where they gather and how to reach them — plus named prospect lists when asked. Use when the marketer says "research our audience", "who should we target", "mine our reviews", "why do people buy us or leave", "where does our audience hang out"; or for lists: "find 50 right-fit leads with emails", "find retailers or accounts to pitch", "score these leads / who do we call first", "who's looking for an alternative to X", "tell me when a past champion changes jobs". Reads the brand's own customer data first and delivers a readable report saved to the brand. Never contacts anyone. Not for market size or trends — use research-market; not for writing the messages — use write-outreach.
What it loads into context
Frontmatter
196 tokensAlways available to the agent
SKILL.md
4,528 tokensWhen the skill is activated
Reference documents
47,033 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
../claims-gate/SKILL.mddoc15,033 bytes../marketing-guide/SKILL.mddoc17,316 bytes../marketing-guide/research-pattern.mddoc1,828 bytes../outcomes-ledger/SKILL.mddoc11,207 bytes../research-audience-segment-pass/SKILL.mddoc4,381 bytesSKILL.mdcore19,108 bytesSKILL.mdcore19,108 bytesreferences/audience-research.mddoc16,241 bytesreferences/contacts-and-compliance.mddoc9,909 bytesreferences/data-sources.mddoc12,574 bytesreferences/fit-and-scoring.mddoc7,753 bytesreferences/list-by-company-type.mddoc4,637 bytesreferences/list-mode.mddoc7,660 bytesreferences/list-sources.mddoc10,146 bytesreferences/output-format.mddoc5,432 bytesreferences/quote-bank.mddoc6,482 bytesreferences/run-memory.mddoc5,300 bytesreferences/score-a-list.mddoc7,759 bytesreferences/signals-and-hooks.mddoc6,297 bytesreferences/watches.mddoc4,861 bytesskill.meta.jsonasset6,490 bytestests/test-by-hand.mddoc9,149 bytes../save-learning/SKILL.mddoc9,842 bytes../save-to-brain/SKILL.mddoc6,868 bytes../spend-gate/SKILL.mddoc6,102 bytes../write-report/SKILL.mddoc8,986 bytes
Read SKILL.md
# research-audience
Audience research answers, for the people a brand sells to: **who they are** (buyer groups, sized in buyers, with buying roles), **what they want**, **their problems and how we solve them**, **their words** (the customer-quote bank), **where they gather**, and **how to find and reach them**. It owns the brand's **one list of buyer groups** and the **quote bank**; market research reads them and sizes the market around them (its figures are context; group sizes are counted here), and every maker reads them. A list of named people is a separate mode, only when asked. The craft is in [references/audience-research.md](references/audience-research.md) and [references/quote-bank.md](references/quote-bank.md); this file is the order of work.
**The rule that matters most: the brand's own customers first, then free pass, report once** (`../marketing-guide/research-pattern.md` (in the `marketing-guide` skill) — read it before the first search). One specific question for the brand's customer data is allowed up front; after that, cover every group on every dimension from free sources before the next message. Never stop to ask "which group should I go deeper on?". Paid reads only deepen it, with one credit yes.
**Depth matches the ask; keep to these call caps** (paid reads are credits, only after the one credit yes):
- **Quick** ("who's our customer, roughly?", a single question): no workers, about 20 web calls in all, the answer in chat plus a one-page report.
- **Standard** ("do the audience research", the default): **at most three group workers, one level only**, each capped (segment-pass § Budget); news done by you (about 6 searches) and sizing gaps the workers left (about 6 more). About 80 web calls in all.
- **Deep** (the marketer asks for depth, or after the paid top-up yes): up to five workers; the caps stay.
Never brief a worker to load this playbook or any skill — the brief is [the `research-audience-segment-pass` skill](../research-audience-segment-pass/SKILL.md) pasted whole plus the inputs, and nothing else; workers use only web search and page reads, no GooseWorks calls. Sampling and saving the quote bank ([references/quote-bank.md](references/quote-bank.md)) are yours, not the workers'. Workers never start workers. Search before you fetch; fetch only a page you'll quote or count from.
## What you get
View the complete source on GitHubresearch-audience-account-sourcing
When your agent uses it
Step of the research-audience playbook: finds candidate accounts matching the fit definition, confirms gates, applies exclusions and dedupes. Run research-audience instead; not for direct use.
What it loads into context
Frontmatter
61 tokensAlways available to the agent
SKILL.md
846 tokensWhen the skill is activated
Reference documents
6,272 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore3,897 bytesSKILL.mdcore3,897 bytesskill.meta.jsonasset259 bytes../research-audience/references/data-sources.mddoc12,574 bytes../research-audience/references/list-by-company-type.mddoc4,637 bytes../research-audience/references/list-sources.mddoc10,146 bytes
Read SKILL.md
# account-sourcing
**Reads:** the draft definition (or the corrected one on a re-run); exclusions; the source(s) picked from `../research-audience/references/list-sources.md`; `../research-audience/references/data-sources.md`; `../research-audience/references/list-by-company-type.md`; lists the human supplied (exhibitor lists, directories, target-account lists, customer lists for lookalikes).
**Does:**
0. **Search, don't remember.** Every candidate comes from a search or page this run read, recorded in `source` with the query and date (e.g. "Meta Ad Library, keyword '<category term>', 20 Oct"). Never seed the list with brands the model knows as well known: they are the least likely to buy a small tool and the most contacted. Selling to marketers: an ad-library keyword or category search — in the browser page by page as a person would, never paged by script; at volume through the paid ad-library reads inside the approved top-up.
1. Start from the picked source (switch-intent posts, hiring posts, rivals' customers, event speakers and sponsors, developer clusters, ad libraries, directories — `../research-audience/references/list-sources.md`), which gives accounts that already carry a signal. Then the other free sources before any paid read: human-supplied lists if any; the host's web search with queries built from the definition (industry terms, geography, situation words, `site:` filters for directories, association member lists, "top <category> <city>" roundups, conference exhibitor and sponsor pages, job boards); company sites and LinkedIn public company pages read in the host browser for firmographics; rivals' public customer and case-study pages; ad libraries in the browser when "spends on ads" is part of fit. Paid bulk reads only in the top-up the human approves.
2. Retail lists: comparable brands' stockist and store-locator pages are the best source of shops that carry similar products; wholesale marketplaces' public brand pages too.
3. Evidence-first when a technology or situation is a hard gate: search for the evidence (job posts or integration pages naming the tool, press about the situation) and take the companies from it, instead of screening an industry and failing most of it.
4. Lookalikes: when the brain holds known customers, describe what they share and search for that shape — never list a customer.
5. For each candidate, confirm the hard gates with a dated source (size, industry, geography, required tech or situation). Unconfirmable gate = dropped with reason "could not confirm <gate>".
6. Apply exclusions and dedupe on root domain, parent company and brand variants ("Acme Inc" vs "Acme Labs"; regional ccTLDs; acquired brands on old domains). Subsidiary of an excluded parent = excluded.
7. Database route (when the connector has it, inside the approved ceiling): one broad company or people search for the definition, count and sample first (`../research-audience/references/data-sources.md` § When the contact routes exist). In a paid top-up only: keep a running sum of credits charged and stop before the next lookup could pass the ceiling.
8. Note the rough universe size seen ("~140 accounts match in US/CA") — it tells the human whether the definition is too narrow or too broad.View the complete source on GitHubresearch-audience-fit-definition
When your agent uses it
Step of the research-audience playbook: drafts the searchable fit definition, exclusions and list size that the list run then searches on. Run research-audience instead; not for direct use.
What it loads into context
Frontmatter
61 tokensAlways available to the agent
SKILL.md
765 tokensWhen the skill is activated
Reference documents
6,950 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore3,361 bytesskill.meta.jsonasset428 bytes../research-audience/references/fit-and-scoring.mddoc7,753 bytes../research-audience/references/list-by-company-type.mddoc4,637 bytes../research-audience/references/list-sources.mddoc10,146 bytes../save-to-brain/SKILL.mddoc6,868 bytes
Read SKILL.md
# fit-definition
**Reads:** the brand's own site in the host browser (what it sells, pricing, case studies, customer logos, integrations, who it says it's for); `brand_read` summary/onboarding/competitors/learnings; `knowledge_search` for ICP, segments, win/loss, customers, past outbound; the saved fit definition; the saved buyer groups (`research/audience/buyer-groups.md`) — the lead group, or the one the ask names, is the starting definition; the ask itself; `../research-audience/references/fit-and-scoring.md`; `../research-audience/references/list-by-company-type.md`. No answers from the human yet — this atom drafts.
**Does:**
1. Identify the motion (who the list is for — usually already in the request) and pick the list unit from the company-type table. Several motions → one definition each. Retail, wholesale and venue lists use the retail variant (door count, price tier, assortment, review window, chain vs independent route).
2. Fill every part of the definition table from the site, the brain and the ask. Mark each line **sourced** (with its link or brain item) or **assumed** (your best reading, with why). Never leave a line blank to ask about — assume it, label it, and let the human correct it in the report's message.
3. Turn loss notes and "not a fit" replies into the negative ICP.
4. Translate personas into title synonyms and seniority by company size. Hiring-led lists: write the role map (replaces / augments / buys / champions / uses, and the job-ad keywords that confirm relevance) — `../research-audience/references/list-sources.md` § Hiring.
5. Load exclusions: the human's files (customers, open deals, do-not-contact; for retail, the brand's current stockists), the contacted ledger and suppression, competitor **domains** from `competitor_read` (never names or handles — they can be mis-resolved), the seller's own domain. Normalise to root domains.
6. Account value (account-based lists): set the V1/V2/V3 rule from the brand's pricing page and customer logos (seats, locations, plan tiers), labelled assumed; the human corrects it later.
7. Size: what the human asked for, checked against what they can work; partner and app lists default to 20–30 — say what a bigger number does to fit.
8. No ICP anywhere: draft from what the brand sells and its customer logos; where two readings are equally likely, build the free pass on the stronger one and name the other in the report as an alternative.
9. Write the draft definition as one compact block for the report, assumed lines first, and say what any open line will do to the list. Do not wait for a yes — the free pass runs on the draft.View the complete source on GitHubresearch-audience-people-and-contacts
When your agent uses it
For a list of companies, picks 1-3 current people per company in different buying roles, confirms each title with a dated source, finds a public contact route, labels email status honestly and flags regions with contact rules. Never contacts anyone. Use alone when you already have a vetted company list and the buyer titles; otherwise run research-audience.
What it loads into context
Frontmatter
100 tokensAlways available to the agent
SKILL.md
949 tokensWhen the skill is activated
Reference documents
5,214 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore4,317 bytesSKILL.mdcore4,317 bytesSKILL.mdcore4,317 bytesskill.meta.jsonasset288 bytes../research-audience/references/contacts-and-compliance.mddoc9,909 bytes../research-audience/references/data-sources.mddoc12,574 bytes
Read SKILL.md
# people-and-contacts
**Reads:** passing accounts; personas and title synonyms; `../research-audience/references/contacts-and-compliance.md`; `../research-audience/references/data-sources.md`.
**Does:**
1. Free first, breadth before depth: for every kept account, get names and titles from the cheapest place first — the company's team, about and leadership pages, press releases, conference speaker pages, podcast guest pages, public profile headlines in web-search results (`"<title>" "<company>"`), the company's LinkedIn page's public people list. Paid profile reads only in the approved top-up, to confirm titles the free pass could not.
2. Pick by company size and role (champion + economic buyer; category buyer for retail). Max 3 per account, different roles.
3. Confirm current employer and title from a dated source (a dated search headline counts, labelled `search-headline`); if sources disagree, the newer wins; if unclear, drop. Chains → an account row with the vendor portal or buying-office route, plus 1–2 person rows (same `account_id`) for a category buyer confirmed by a dated source: LinkedIn route, email only if published or pattern-evidenced. Leave person rows out only when the retailer's vendor page says portal-only or not to contact buyers — note it in `notes`. Independent shops and small venues → one account-level row with the shop's published inbox (own-domain or published webmail) or IG/DM as the route; the owner's name only if a dated source gives it — an unnamed owner is not a reason to drop. Drop third-party recruiters and consultants (people who don't work for the account), fractional/advisor, interns, ex-, agency staff named for a client, competitor and own staff. When the account *is* a recruiting or staffing firm, its recruiters, sourcers and researchers are the users and champions — keep them.
4. Contact route — when the connector has email find and check, follow `../research-audience/references/data-sources.md` § When the contact routes exist (cheapest first, stop at the first found address the checker passes — one checker, a second only on `unknown` — never phones or personal modes). Otherwise: look for the exact work address on public pages (team page, press release, filing, speaker bio). Found → `email_candidate` with status `published (<url>)` (an address moves to `email` only after a checker passes it). Pattern-guess only when a published address at the same domain shows the pattern — cite it. A shop's own published webmail address counts as `published`. Otherwise record the best other route (LinkedIn, buying inbox, contact form, phone, IG for small shops).
5. Set the person's location and `region_flag`; exclude Germany/Austria by default unless the human said otherwise; flag UK sole traders/partnerships `UK-soletrader: consent needed` (Companies House check) and give them a visit or a letter as the route (`other_contact_route` = `visit/letter: <published shop address> (<url>)`) (phone only after a TPS check, noted; never a cold IG DM), with `email` blank; a Canadian or AU/NZ `pattern-guess` is not sendable — give another route or drop; other countries flagged `other:<country>`.
6. **Suppression check:** hash each person's keys the ledger's way (outcomes-ledger § Suppression without personal data) and drop any that match a suppressed `key_hash` — before any paid lookup on them.
**Writes:** people rows with title source and date, `email` (checker-passed only), `email_candidate`, `email_status`, `email_source`, `other_contact_route`, `person_location`, `region_flag`, `persona_role`.View the complete source on GitHubresearch-audience-score-segment-qa
When your agent uses it
Step of the research-audience playbook: scores and tiers list rows, groups them into segments with an angle each, runs the pre-handover checks and writes the list files. Run research-audience instead; not for direct use.
What it loads into context
Frontmatter
76 tokensAlways available to the agent
SKILL.md
864 tokensWhen the skill is activated
Reference documents
9,310 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
../claims-gate/SKILL.mddoc15,033 bytesSKILL.mdcore3,526 bytesskill.meta.jsonasset430 bytes../research-audience/references/contacts-and-compliance.mddoc9,909 bytes../research-audience/references/fit-and-scoring.mddoc7,753 bytes../research-audience/references/output-format.mddoc5,432 bytes
Read SKILL.md
# score-segment-qa
**Reads:** account table, people rows, signals; `../research-audience/references/fit-and-scoring.md`; `../research-audience/references/output-format.md`; `../research-audience/references/contacts-and-compliance.md`.
**Does:**
1. Score: gates already passed; add points by block, each with its cited reason in `fit_reason`. Tier A/B; C to `dropped.csv`. Set the value tier (V1/V2/V3) with its evidence for account-based lists; rank by tier and value together.
2. Segment by angle × signal (e.g. "new leader", "hiring for the pain", "fit, no signal"), 3–6 segments, each with a **three-line angle**: *pain* (the situation in the buyer's terms, from the signals), *proof* (one signed-off claim, verbatim, cleared through the `claims-gate` skill (`../claims-gate/SKILL.md`) — or "you'd need proof of <X> first", which the message offers to sign off), *ask* (one low-friction next step). Never an invented result or number.
Then **For you** per segment: does it fit us (yes/no and why, from our product, pricing and customers); what to send first and to whom (V1 accounts first); then offer, as a closing decision, the messages written for this list (write-outreach reads `list.csv` and these angles). Don't follow the herd: if every rival pitches this segment the same way, say so and offer a different angle from what buyers say (this playbook's quote bank, `research/audience/voc-bank.md`).
**You vs them**: accounts where a rival is in use (from job posts naming the tool, case studies, integration pages) — where we're ahead (say it louder), behind, and where everyone sounds the same.
3. Rank: tier, then score, then warm path.
4. QA checklist — every item, every run:
- domain is the current company's live site, not a parent or old brand;
- no duplicate people or domains; concentration cap held;
- all exclusions applied (customers, open deals, ledger, competitors, do-not-contact, own staff);View the complete source on GitHubresearch-audience-segment-pass
When your agent uses it
Step of the research-audience playbook: the worker brief for researching one buyer group, returning notes in a fixed shape. Run research-audience instead; not for direct use.
What it loads into context
Frontmatter
60 tokensAlways available to the agent
SKILL.md
1,093 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Budget — stop at it
- Whose words count
- 0. Size and buying roles
- 1. What they want
- 2. Their problems — and why they leave
- 3. Their words
- 4. Where they gather
- 5. Three moves
- 6. Rivals
- Return this shape
Files
SKILL.mdcore4,381 bytesSKILL.mdcore4,381 bytesskill.meta.jsonasset255 bytes
Read SKILL.md
# segment-pass
You are researching **one buyer group** for **one brand**. **This brief is complete: don't load any skill, don't read playbook files, don't start other agents; use only web search and page reads — no GooseWorks calls.** Do every section below, inside the budget, then return. Never stop to ask. A blocked, empty or login-only source goes under "Couldn't read" — nothing you couldn't read may carry a conclusion or a move.
**Inputs (in the prompt):** the group and how to recognise one · the brand, what it sells, its price, its site, its approved claims · what the brand's own customer data says about this group, if shared · quote rows already saved for this group (add to them, don't re-mine) · the rivals · today's date.
## Budget — stop at it
- **At most 12 web searches and 10 page reads.** Search first; read a page only when you will quote or count from it. When a page read returns a summary, ask it for the exact sentences with author and date, not a summary.
- Order if you run short: §2 problems and §3 words → §4 places → §5 moves → §1 wants → §0 size → §6 rivals. Say what you dropped.
- Return **at most 700 words** in the shape at the end. No preamble.
## Whose words count
View the complete source on GitHubresearch-audience-signals-and-hooks
When your agent uses it
For a list of companies, finds dated, linked timing signals from the last 90 days (funding, new leaders, hiring, launches), drops stale ones and noise, scores timing, and gives one personal hook per person from their recent public work. Facts only, no message copy. Use alone when you already have the company list and, for hooks, the people; otherwise run research-audience.
What it loads into context
Frontmatter
110 tokensAlways available to the agent
SKILL.md
447 tokensWhen the skill is activated
Reference documents
1,461 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore1,888 bytesskill.meta.jsonasset286 bytes../research-audience/references/signals-and-hooks.mddoc6,297 bytes
Read SKILL.md
# signals-and-hooks
**Reads:** account table; people (for hooks); `../research-audience/references/signals-and-hooks.md`; champions list if the human supplied one.
**Does:**
1. News first, per account: a web search for the company over the last 90 days (funding, new leader, launch, expansion, acquisition, layoffs, awards that matter to the buyer). Then the signals that matter for this motion (the reference table): careers page and job boards, company news and posts. Stop once one strong fresh signal is found unless a second is cheap. Anything from the last 14 days is a **timely opening** for the report.
2. Record each as fact · URL · publish date · retrieved date · why now. Re-check job posts are still live.
3. Drop anything past its window and anything on the noise list. Funding alone never makes an account tier A.
4. Score timing by judgment against the anchors (strength, recency, capped at 40), with the reason written in the row.
5. Per person (run again after people-and-contacts, from SKILL step 6), find one hook from their professional public activity in the last ~60 days; tie it to the pain. None found → "none found". Account rows (independent shops, chains) get one hook too, from the shop's recent posts or events. Never use banned topics.
**Writes:** `signal_1/2` (+url, date), timing points, `hook` (+url).
**Rules:** no URL, no signal. Never write outreach copy here — facts only.View the complete source on GitHubresearch-competitors
When your agent uses it
Competitor research: what every main rival is running, launching, charging and saying now, what works for them, and what that means for you. Use when the marketer asks for competitor research or a teardown, "what ads are my competitors running", "how do they price", "find gaps and angles", "what changed this week" (a weekly watch), or "X just launched / shut down / cut prices" (react now). Also builds a sales battlecard, checks a competitor page's tools/pixels, or studies who engages with their LinkedIn posts. Delivers a readable report saved to the brand, so the next run reports what changed. Never copies their words or disparages them. Not for what people say about you or your market — use research-market; not for who your buyers are — use research-audience.
What it loads into context
Frontmatter
202 tokensAlways available to the agent
SKILL.md
2,774 tokensWhen the skill is activated
Reference documents
55,580 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
../claims-gate/SKILL.mddoc15,033 bytes../marketing-guide/SKILL.mddoc17,316 bytes../marketing-guide/research-pattern.mddoc1,828 bytes../research-competitors-category-pass/SKILL.mddoc4,654 bytes../research-competitors-edge-cases/SKILL.mddoc2,147 bytes../research-competitors-rival-pass/SKILL.mddoc6,230 bytesSKILL.mdcore11,966 bytesSKILL.mdcore11,966 bytesreferences/angles-and-gaps.mddoc7,532 bytesreferences/battlecard.mddoc3,918 bytesreferences/focused-outputs.mddoc2,770 bytesreferences/linkedin-engagers.mddoc6,417 bytesreferences/page-technology.mddoc2,784 bytesreferences/reading-ads-honestly.mddoc8,767 bytesreferences/report-format.mddoc10,202 bytesreferences/research-spec.mddoc35,304 bytesreferences/rival-craft.mddoc16,413 bytesreferences/run-memory.mddoc6,791 bytesreferences/watch-and-react.mddoc13,004 bytesskill.meta.jsonasset5,638 bytestests/examples/2026-10-22/battlecard.mddoc5,590 bytestests/examples/2026-10-22/engagement-report.mddoc3,744 bytestests/examples/2026-10-22/engagers.csvasset1,788 bytestests/examples/2026-10-22/excluded.csvasset1,039 bytestests/examples/2026-10-22/technology.mddoc3,226 bytestests/fixtures/engagers.csvasset1,995 bytestests/fixtures/focused-evidence.mddoc3,936 bytestests/fixtures/page-source.htmlasset614 bytestests/test-by-hand.mddoc7,662 bytes../run-memory/SKILL.mddoc18,060 bytes../save-learning/SKILL.mddoc9,842 bytes../save-to-brain/SKILL.mddoc6,868 bytes../spend-gate/SKILL.mddoc6,102 bytes../write-report/SKILL.mddoc8,986 bytes
Read SKILL.md
# research-competitors
Competitor research tells the marketer what to do next; it is not a list of ads. Craft: `references/research-spec.md`; worker briefs: its step skills (`research-competitors-<step>`); the report: `references/report-format.md` — next to this file.
**The rule that matters most: free pass first, ask nothing, report once** (`../marketing-guide/research-pattern.md` (in the `marketing-guide` skill) — read it before the first search). For a full teardown, research every dimension for every main rival, browser-only sources included, before the first message; never ask permission for free work or offer to pay for what a free read could get. An ask that names an area ("what ads are they running?") gets that area covered completely, news and launches first.
## Before you start
1. **Setup first:** do the `marketing-guide` skill (`../marketing-guide/SKILL.md`) §1–2 (connect, brand, brain read) before anything else; the job line is "I research your competitors and save what I find through it." Here: a named brand not in the account → create it from its website (`gooseworks:brand_setup_create`) without asking and wait for its research (`gooseworks:job_get`); don't show a menu unrelated to research. Fallback brand read: `gooseworks:brand_read` (`summary`, `kit`, `products`, `competitors`, `organic`, `learnings`). Either path: `gooseworks:competitor_read` (+ `suggestions`), `gooseworks:automation_list`; workspace: `research/competitors/` (last report, rival records), `research/market/` (the newest market report and its "which market" decision), `research/audience/` (`buyer-groups.md` and the latest audience report), `plans/`, `reports/performance/`. Brand facts: brain first, website second. Claims: only the read step of the `claims-gate` skill (`../claims-gate/SKILL.md`) now.
2. **Focused output:** for a battlecard, page tools/pixels, or LinkedIn engagers, select and finish the matching branch in `references/focused-outputs.md` after setup, then return. Reuse saved evidence; these branches replace the full teardown below.
3. **Run memory:** job `competitor research` or `competitor watch`; what this job hands the atom is in `references/run-memory.md`. Its "since last time" opens the chat and the report's story.
4. Never change the host's settings or permissions, and never seed a search or a worker with names or claims from memory — only what a source gave you.
## StepsView the complete source on GitHubresearch-competitors-category-pass
When your agent uses it
Step of the research-competitors playbook: the worker brief covering the whole category, including searches, AI answers, community threads and category ad winners. Run research-competitors instead; not for direct use.
What it loads into context
Frontmatter
68 tokensAlways available to the agent
SKILL.md
1,107 tokensWhen the skill is activated
Reference documents
1,538 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Money searches
- 2. AI-answer presence
- 3. Community — how buyers frame the choice
- 4. Creator demos and reviews
- 5. Category-wide ad winners
- 6. Our own brand in the field
- 7. Adjacent options
- Return this, in this shape
Files
SKILL.mdcore4,654 bytesSKILL.mdcore4,654 bytesskill.meta.jsonasset305 bytes../research-competitors-rival-pass/SKILL.mddoc6,230 bytes
Read SKILL.md
# category-pass
You cover what no single rival pass sees: how buyers search and choose in this category, and where our brand stands. Do every section; never stop to ask whether to go deeper. Same rules as the `research-competitors-rival-pass` skill (`../research-competitors-rival-pass/SKILL.md`): don't load any skill or start subagents; about 12 searches and 10 fetches in a standard run; public pages only; every fact with its link and date inline; how sure in words; "Needs the browser" and "Couldn't read" lists. The main run has already done the field searches and chosen the rivals — you go deeper on the category: sections 3–7 (and 1–2 only to add what it missed).
**Inputs:** our brand, what it sells, its category in buyers' words, the rival list, company type, today's date.
## 1. Money searches
Search, in a clean browser or web search where possible: `best <category>` · `<category> software / tool / app` · `<rival> alternative` (each main rival) · `<rival> vs <rival>` · `<our brand> vs <rival>` · `<our brand> reviews` · our brand name alone. Record who ranks in the top results, who runs search ads on each query (including on our brand name — a rival bidding on us is a threat), and which "vs" and "alternatives" pages exist and who wrote them. Results vary by location; say where you searched from.
## 2. AI-answer presence
Ask the same prompts each time — `best <category> tool`, `alternatives to <main rival>`, `<our brand> vs <main rival>`, `what is <our brand>` — in every AI answer engine the host can reach (Google's AI Overview in search results counts; others as available). Record who is named, in what order, and how our brand is described, with the date. Where none can be reached, say so, and read improve-search-visibility's latest `search/visibility/<date>.md` if it exists.
View the complete source on GitHubresearch-competitors-edge-cases
When your agent uses it
Step of the research-competitors playbook: rules for run edge cases such as no browser, stalled workers, earlier reports and late reads. Run research-competitors instead; not for direct use.
What it loads into context
Frontmatter
66 tokensAlways available to the agent
SKILL.md
512 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore2,147 bytesskill.meta.jsonasset261 bytes
Read SKILL.md
# edge-cases
- **No browser at all** (hosted chat, a scheduled run): use the server's free ad sample for tracked rivals (`gooseworks:ads_template_read`, mode `competitor`) and whatever fetch can read. Say once, in the report's "In short", what couldn't be read and what it means for the answer; the paid top-up for it is a decision in the closing message, never a question before the report.
- **The browser waits on the founder's approval:** tell them in one line what it is for, move on with what you have, and list the page as couldn't-read. Never sit silent.
- **A worker stalls** for more than a few minutes: say so in one line. **A worker is stopped:** keep everything it returned or wrote; never throw read work away.
- **Facts from earlier saved research** (dates, figures, launches): re-check them, or mark them "from earlier research, not re-checked".
- **A saved rival that isn't one** (a person's account, a namesake, a dead company): drop it, and name it in the report so the founder can fix the list.
- **An earlier report on this brand exists:** decide on purpose, and say which in one line — in chat and in the report's first "In short" bullet. Newer than 7 days and the ask doesn't say "fresh" or "update": **reuse** it as the base — re-check only what moves (news, launches, prices, the conversation) and deliver a what-changed report; never re-deliver it untouched. Older, or the founder asks for a fresh look: **refresh** in full. A report from today is replaced at the same path. Never treat a saved report's facts as checked without re-checking the ones the new report leads with.
- **A read lands after the report:** rewrite the whole report, top lines included. Never patch a section in.
- **Status notes are not questions:** one-line notes (the browser heads-up, a stalled worker, a serious risk) are fine before the report; questions are not.View the complete source on GitHubresearch-competitors-rival-pass
When your agent uses it
Step of the research-competitors playbook: the worker brief for profiling one rival at a capped depth, returning a fixed-shape profile. Run research-competitors instead; not for direct use.
What it loads into context
Frontmatter
66 tokensAlways available to the agent
SKILL.md
1,538 tokensWhen the skill is activated
Reference documents
3,853 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Get these, in this order
- Weighting by company type
- Return this, in this shape (about 400–600 words)
Files
SKILL.mdcore6,230 bytesSKILL.mdcore6,230 bytesSKILL.mdcore6,230 bytesskill.meta.jsonasset261 bytes../research-competitors/references/rival-craft.mddoc16,413 bytes
Read SKILL.md
# rival-pass — worker brief
You research **one rival** for **one brand** — or **our own brand** when the brief says so (then "openings" are our own events; skip "where we win"). The main run already chose the rivals and gave you the facts below.
**Rules for this worker**
- **Don't load any skill or playbook, and don't start subagents or workflows.** This brief is all you need. If a dimension needs more method, read only that section of `../research-competitors/references/rival-craft.md`.
- **Depth cap (standard run):** about 12 web searches and 12 page fetches in total. Spend them by the company-type weighting below. A deep teardown (quarterly, or when asked) may double it. Stop a dimension when two reads add nothing new.
- Never stop to ask. Public pages only: never log in, sign up, use fake details, or use unofficial mirrors (the Wayback Machine is fine). Never check or repeat a claim about our brand that no source gave you.
- **Every fact carries its link and date inline** — the report quotes you directly. Say how sure you are in words ("confirmed", "likely", "a guess, because…").
- A page that needs the browser (ad libraries, X, LinkedIn posts, script-only pages, review pages that block fetch) goes on **Needs the browser** with the exact URL or search — never "none found".
**Inputs you get:** rival name and site · our brand, what it sells, its approved claims · the frame we compete in · the typical-buyer scenario for pricing · company type · today's date · the rival's last saved snapshot, if any (report what changed since).
## Get these, in this orderView the complete source on GitHubresearch-market
When your agent uses it
Market research and brand watch: which market the brand is in, how big the reachable part is, what's changing, how buyers buy and what they pay, what people are saying now, and what it means for positioning. Use when the marketer asks for market research, "how big is my market", "what's changing in my category", "what do others charge", "what are people saying about us", "is there demand for <idea>", or "watch my brand / tell me if something blows up" (alerts only, risk first). Also writes positioning choices and finished messages ("position my product", "write our positioning"). Researches first, asks only decisions at the end, and saves the output to the brand. Not for who the buyers are and their own words — use research-audience; not for a deep look at rivals — use research-competitors.
What it loads into context
Frontmatter
207 tokensAlways available to the agent
SKILL.md
2,489 tokensWhen the skill is activated
Reference documents
35,568 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Before you start
- Steps — the market report
- Brand watch — alerts only
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
../claims-gate/SKILL.mddoc15,033 bytes../marketing-guide/SKILL.mddoc17,316 bytes../marketing-guide/research-pattern.mddoc1,828 bytes../research-market-edge-cases/SKILL.mddoc2,344 bytes../research-market-listening/SKILL.mddoc6,000 bytes../research-market-market-pass/SKILL.mddoc10,386 bytesSKILL.mdcore10,829 bytesreferences/idea-validation.mddoc3,011 bytesreferences/listening-craft.mddoc11,837 bytesreferences/positioning.mddoc6,022 bytesreferences/report-format.mddoc8,677 bytesreferences/run-memory.mddoc9,627 bytesskill.meta.jsonasset5,051 bytestests/examples/2026-10-22/positioning.mddoc8,143 bytestests/fixtures/positioning-evidence.mddoc3,264 bytestests/test-by-hand.mddoc6,897 bytes../run-memory/SKILL.mddoc18,060 bytes../save-to-brain/SKILL.mddoc6,868 bytes../spend-gate/SKILL.mddoc6,102 bytes../write-report/SKILL.mddoc8,986 bytes
Read SKILL.md
# research-market
Market research decides **which market the brand is in, how big the reachable part is, and what's changing in it** — then what that means for the brand. It reads the buyer groups research-audience owns and sizes them; it doesn't build its own. Rivals get one short section that points to competitor research. It also runs a light **brand watch**: risk first, alerts only. The worker briefs are its step skills (`research-market-<step>`) and the craft is in `references/`, next to this file.
**The rule that matters most: free pass first, ask nothing, report once** (`../marketing-guide/research-pattern.md` (in the `marketing-guide` skill) — read it before the first search). Do every dimension before the first message to the marketer; never stop to ask "go deeper?"; never ask for free work. A broad ask gets everything; an ask that names an area — **the market** · **what people are saying** — gets that area covered completely, with news first.
## Before you start
1. **Setup first:** do the `marketing-guide` skill (`../marketing-guide/SKILL.md`) §1–2 (connect, brand, brain read) before anything else; the job line is "I research your market and save what I find through it." Here: call `get_started` with `wants: "more"`; a named brand not in the account → create it from its website (`gooseworks:brand_setup_create`) without asking and wait for its research (`gooseworks:job_get`); don't show a menu unrelated to research. Fallback brand read: `gooseworks:brand_read` (`summary`, `kit`, `products`, `competitors`, `learnings`, `sources`, `organic`, `accounts`) and `gooseworks:knowledge_search`. Either path: `gooseworks:competitor_read`; workspace: `research/market/` (the last report and watch log), `research/audience/` (`buyer-groups.md` — the groups with their counts — and the latest audience report), `research/competitors/` (the latest report), `plans/`, `research/credits-log/`. Where the brain and the website differ on a brand fact, say so and use neither as a claim. Claims: only the read step of the `claims-gate` skill (`../claims-gate/SKILL.md`) now.
2. **Positioning ask:** when the user wants positioning choices, a new position or finished messages, complete `references/positioning.md` after setup and return. It reuses the saved research and fills only its evidence gaps; a full market-size report is not a prerequisite.
3. **Run memory:** job `market research`, `market pulse` or `brand watch`; what this job hands the atom is in `references/run-memory.md`. Its "since last time" opens the chat and the report's story.
4. **An idea, not a market?** When the ask names a product, offer or concept that doesn't exist yet ("is there demand for …?"), run the same steps pointed at it, with `references/idea-validation.md`.
5. Never change the host's settings, and never seed a search with names or claims from memory.
View the complete source on GitHubresearch-market-edge-cases
When your agent uses it
Step of the research-market playbook: rules for run edge cases such as no browser, stalled workers, earlier reports and late reads. Run research-market instead; not for direct use.
What it loads into context
Frontmatter
59 tokensAlways available to the agent
SKILL.md
550 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore2,344 bytesskill.meta.jsonasset244 bytes
Read SKILL.md
# edge-cases
- **No browser at all** (hosted chat, a scheduled run): use search results, the pages fetch can read, and the free server reads (`brand_read` `organic`, `gooseworks:social_inspiration_search`). Say once, in the report's "In short", what couldn't be read and what it means for the answer; the paid top-up for it is a decision in the closing message, never a question before the report.
- **The browser waits on the founder's approval, or keeps asking:** tell them in one line what it is for, then finish the same reads with search and fetch (`site:` queries, each post's own link) — first-hand evidence such as the brand's own users is finished another way, never dropped. List only what still couldn't be read. Never sit silent.
- **A worker stalls** for more than a few minutes: say so in one line. **A worker is stopped:** keep everything it returned or wrote; never throw read work away.
- **Facts from earlier saved research** (dates, figures, launches): re-check them, or mark them "from earlier research, not re-checked".
- **A saved rival that isn't one** (a person's account, a namesake, a dead company): drop it, and name it in the report so the founder can fix the list.
- **An earlier report on this brand exists:** decide on purpose, and say which in one line — in chat and in the report's first "In short" bullet. Newer than 30 days (a monthly pulse covers less) and the ask doesn't say "fresh" or "update": **reuse** it as the base — re-check only what moves (news, launches, prices, the conversation) and deliver a what-changed report; never re-deliver it untouched. Older, or the founder asks for a fresh look: **refresh** in full. A report from today is replaced at the same path. Never treat a saved report's facts as checked without re-checking the ones the new report leads with.
- **A read lands after the report:** rewrite the whole report, top lines included. Never patch a section in.
- **Status notes are not questions:** one-line notes (the browser heads-up, a stalled worker, a serious risk) are fine before the report; questions are not.View the complete source on GitHubresearch-market-listening
When your agent uses it
Step of the research-market playbook: the worker brief for listening to what people say about the brand and category, risks first. Run research-market instead; not for direct use.
What it loads into context
Frontmatter
58 tokensAlways available to the agent
SKILL.md
1,401 tokensWhen the skill is activated
Reference documents
2,787 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Two ways you run
- Steps
- Return this, in this shape
Files
SKILL.mdcore6,000 bytesSKILL.mdcore6,000 bytesskill.meta.jsonasset243 bytes../research-market/references/listening-craft.mddoc11,837 bytes
Read SKILL.md
# listening
You listen to **what people are saying right now** about the brand, its founder, its products and its category, on the platforms its buyers use. Do every platform on the list before you return. Never stop to ask. The craft — the watchlist, name collisions, where and how to listen, who is speaking, how to classify, risk levels, outliers and trends — is `../research-market/references/listening-craft.md`; read it first.
**Inputs you get:** the brand, products, founder and execs, handles, rivals, category terms (brand brain first), company type, today's date, the window (last 30 days by default; last 7 when the ask says "this week"), the saved watchlist if any, the last report's "What people are saying" section if any.
**Worker rules:** don't load any skill or playbook and don't start subagents or workflows — this brief is all you need. Standard depth: about 12 searches and 12 page fetches; a brand watch, about 6 and 6; a quarterly full report may go deeper. **Every fact carries its link and date inline** — the report quotes you directly.
**Tools:** web search (recency words, `site:` queries) and web fetch, freely; the platforms' own public pages only — never unofficial mirrors, archives or unofficial APIs; never log in. Pages that need the browser go on "Needs the browser" for the main run. **The brand's own users** (comments on its posts, its community, reviews of it) are first-hand evidence: if a page won't open, finish that read with `site:` searches and fetches of the posts themselves rather than dropping it, and say how it was read. Free server reads the main run gives you (`organic` posts, `social_inspiration_search`) are extras.
## Two ways you run
- **Inside a market report:** all steps below; return the full shape.
- **Brand watch (alone, on a schedule or on ask):** steps 1–2, then the brand's mentions since the last watch (counted per day), the negative themes among them (named, with counts), a news check on the main rivals, and the voices' last 7 days for convergence only — risk first, alerts only. Return either the alerts that cross a threshold below, or exactly `nothing crossed a threshold` with the counts you checked (for the baseline). No positive themes, outliers or trends.View the complete source on GitHubresearch-market-market-pass
When your agent uses it
Step of the research-market playbook: the worker brief for researching the market itself, including category, size, changes, pricing norms and demand. Run research-market instead; not for direct use.
What it loads into context
Frontmatter
61 tokensAlways available to the agent
SKILL.md
2,316 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Which market are we in — a decision, not a description
- 2. How big — top-down and bottom-up
- 3. What's changing — last 12 months, newest first
- 4. How and where buyers find and buy
- 5. What buyers pay — pricing norms
- 6. Where attention is — channels
- 7. Demand and seasonality
- 8. The competition in brief
- 9. Baselines for next time
- Return this, in this shape
Files
SKILL.mdcore10,386 bytesSKILL.mdcore10,386 bytesSKILL.mdcore10,386 bytesskill.meta.jsonasset245 bytes
Read SKILL.md
# market-pass
You research **the market** a brand sells into — not its rivals one by one (competitor research does that) and not who the buyers are and what they say (audience research owns the buyer groups and the customer-quote bank; you size its groups). Do every section before you return. Never stop to ask. What you can't reach goes in "Couldn't read" with what it would have added.
**Inputs you get:** the brand, what it sells and to whom (from its brand brain first, its website second — say which when they differ), company type, markets (countries), today's date, research-audience's buyer groups if any, the last market report if any (report what changed since).
**Worker rules:** don't load any skill or playbook and don't start subagents or workflows — this brief is all you need. Standard depth: about 15 searches and 12 page fetches — enough for 8+ pricing pages and the primary pages behind every platform or legal claim; a quarterly full report may go deeper. **Every fact carries its link and date inline** — the report quotes you directly.
**Tools:** web search and web fetch. Use them freely. Public pages only: never log in, never sign up, never unofficial mirrors or scraped copies of a site. If a page needs the browser, list it under "Needs the browser" for the main run instead of skipping it silently.
**Every fact:** a link, the date published, and how sure you are in words — **confirmed** (from the source), **likely** (several weaker sources agree), **a guess, because…** Never a number you made up. Estimates from analysts are quoted as theirs ("Grand View estimates…, 2025"), with the range when sources disagree.
## 1. Which market are we in — a decision, not a description
View the complete source on GitHubrun-memory
When your agent uses it
Shared step of the marketing playbooks (analyze-performance, run-paid-campaigns, research-competitors, email-lifecycle): reads the last run's record, checks whether its recommendations were done and whether they worked, and saves a short record of this run for the next one. Loaded by those playbooks; not for direct use.
What it loads into context
Frontmatter
92 tokensAlways available to the agent
SKILL.md
4,509 tokensWhen the skill is activated
Reference documents
12,228 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Inputs (the calling playbook supplies them)
- Start of run
- End of run
- Scheduled runs (no human present)
Files
../marketing-guide/SKILL.mddoc17,316 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesSKILL.mdcore18,060 bytesskill.meta.jsonasset691 bytes../save-learning/SKILL.mddoc9,842 bytes../save-to-brain/SKILL.mddoc6,868 bytes../spend-gate/SKILL.mddoc6,102 bytes../write-report/SKILL.mddoc8,986 bytes
Read SKILL.md
# run-memory
A playbook that runs again (often as a weekly or monthly automation) must know what its last run found, what it recommended and whether that worked. This atom is that memory. The **report** is separate (the `write-report` skill, `../write-report/SKILL.md`); a run record is the short, structured note the next run reads.
**Who loads it:** every playbook that can run more than once for the same brand: research, analysis, ads, social, email, search, creators. Not one-off makers (a single post, one photo set). It runs twice per run: **Start** before the playbook's own work, **End** after its report.
**What it does not replace.** Where a playbook already keeps a working log, that log stays the source of truth: run-paid-campaigns' `ads/campaigns/<slug>/state.md` + `decisions.md` (the server's campaign-harness grammar, `R<n>` ids, `## Checks due`), the `outcomes-ledger` skill's ledgers, analyze-performance's `definitions.md`. The run record copies their ids and adds only what they lack (the baseline recipe and the result numbers). It never keeps a second, different copy of their state, and when the playbook has its own scoring rule (run-paid-campaigns' "Score last week"), step 3 below *is* that step. Use its rule and add only what is missing.
## Inputs (the calling playbook supplies them)
| Input | Rule |
|---|---|
| `playbook` | The playbook slug (`analyze-performance`). Goes in the tags. |
| `job` | The job in plain words (`weekly ads check`, `monthly read`, `competitor watch`). Never a slug, tool or id. One playbook with several cadences has one `job` per cadence. Keep it the same on every run, because the next run searches by it. `job-slug` is `job` lower-cased and hyphenated. |View the complete source on GitHubrun-organic-social
When your agent uses it
Runs a brand's organic social: how each platform works now, a strategy per platform and two weeks of posts in the brand's or a person's real voice. Use when a marketer says "run organic social for my brand", "fill my social calendar", "plan two weeks of posts", "grow my X / LinkedIn / Instagram / TikTok", "ghostwrite my founder's posts", "which platforms should we be on?", "plan the social for our launch", "a TikTok or Reel script to shoot on my phone", "tear down @x's account", or "my accounts went quiet". The marketer posts by hand; nothing is posted or scheduled. Not for a standalone post or repurposing one piece — use make-content.
What it loads into context
Frontmatter
182 tokensAlways available to the agent
SKILL.md
5,640 tokensWhen the skill is activated
Reference documents
51,451 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
../claims-gate/SKILL.mddoc15,033 bytes../marketing-data-access/SKILL.mddoc7,955 bytes../marketing-guide/SKILL.mddoc17,316 bytes../run-memory/SKILL.mddoc18,060 bytes../run-organic-social-account-audit/SKILL.mddoc4,512 bytes../run-organic-social-plan-calendar/SKILL.mddoc4,600 bytes../run-organic-social-platform-research/SKILL.mddoc14,009 bytes../run-organic-social-post-check/SKILL.mddoc4,668 bytesSKILL.mdcore23,695 bytesSKILL.mdcore23,695 bytesSKILL.mdcore23,695 bytesreferences/calendar-craft.mddoc11,763 bytesreferences/graphics.mddoc5,954 bytesreferences/platform-native.mddoc3,659 bytesreferences/platform-strategy.mddoc8,885 bytesreferences/post-checks.mddoc10,852 bytesreferences/report-shape.mddoc6,787 bytesreferences/run-record.mddoc8,683 bytesreferences/scheduled-refill.mddoc7,069 bytesreferences/slot-anatomy.mddoc7,790 bytesreferences/voice-card.mddoc4,457 bytesskill.meta.jsonasset8,079 bytestests/test-by-hand.mddoc10,068 bytes../save-learning/SKILL.mddoc9,842 bytes../save-to-brain/SKILL.mddoc6,868 bytes../spend-gate/SKILL.mddoc6,102 bytes../voice-card/SKILL.mddoc7,106 bytes../write-report/SKILL.mddoc8,986 bytes
Read SKILL.md
# run-organic-social
**A post list or focused research request:** after shared setup, use `marketing-data-access` (`../marketing-data-access/SKILL.md`) and its `focused-reads.md` reference for requested post rows, dates, engagement and bounded rankings. For interpretation or voices, use the existing platform-research step, restricted to that question. Deliver the requested list/analysis; skip the full-plan opening, calendar, account-strategy intake and eight-example-per-platform gate. A top-voices list states its ranking evidence and coverage, rather than claiming an exhaustive directory.
**Say once, at the start, in these words or close:** "I'll look at how each platform works right now and what's getting watched in your space, then give you a plan and two weeks of posts. I can't post for you yet; you'll post by hand."
## What you get
A report the marketer opens with one click (delivered through the `write-report` skill (`../write-report/SKILL.md`)):
- **In short:** what we looked at, the 2–3 findings with how sure, then the one move to make first, resting on them.
- **Per platform:**
- how it works right now (dated, with sources);
- what's working in this niche there, with linked examples;View the complete source on GitHubrun-organic-social-account-audit
When your agent uses it
Reviews a brand's own social accounts: what each is for, the last ~30 posts ranked against the account's own median with the likely reason for top and bottom posts, cadence actually kept, best posting times, and bio and pinned-post fixes. Use alone when you already know which accounts to review and can read their posts; otherwise run run-organic-social.
What it loads into context
Frontmatter
102 tokensAlways available to the agent
SKILL.md
1,102 tokensWhen the skill is activated
Reference documents
4,371 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Which accounts exist and what each is for
- 2. What has worked (per account)
- 3. Profile hygiene (text the human can paste)
- Output
Files
../marketing-data-access/SKILL.mddoc7,955 bytesSKILL.mdcore4,512 bytesskill.meta.jsonasset444 bytes../run-organic-social/references/voice-card.mddoc4,457 bytes../spend-gate/SKILL.mddoc6,102 bytes
Read SKILL.md
# Account audit
Run before the first calendar, and lightly (reconciliation only) on later runs.
## 1. Which accounts exist and what each is for
- `gooseworks:brand_read` `sections: ["accounts","sources","organic"]`. `organic.own_accounts` lists the brand's own TikTok/IG handles. `sources` lists saved public sources, including `relationship: self` social accounts. `accounts` lists connected accounts.
- `gooseworks:social_account_list`: the TikTok/IG accounts the product manages, with their setup status. Read each with `gooseworks:social_strategy_get` (pillars, voice, rules, plug-ratio cap).
- The brain has no record of LinkedIn, X, Threads, YouTube, Pinterest or Facebook accounts today, so check `social/accounts.md` in the workspace for a previous run's answers. Ask only for what is still missing: handles, which ones matter, brand vs founder, who approves founder posts, the time zone, the tool they post from, their free windows for the first hour after posting.
## 2. What has worked (per account)
- **TikTok/IG:** `own_posts` from `brand_read organic` give caption, `posted_at`, views, likes and comments. `gooseworks:social_analytics_get` adds more for managed, connected accounts (it says `not_available` otherwise).
- **More history, or LinkedIn, X and Threads:** read the account's own posts through the proxy (the `marketing-data-access` skill (`../marketing-data-access/SKILL.md`); verified endpoints only, as listed in `../run-organic-social/references/voice-card.md`). Use the author's own posts only. For X: `/v1/twitter/profile`, then `/v1/twitter/user-tweets` (popular posts, not the newest: check `created_at`; the numbers are in `legacy`). This runs under the `spend-gate` skill (`../spend-gate/SKILL.md`) branch B: **one** yes to a ceiling, asked in the draft-report message (SKILL.md step 2), with the probe run inside it and every charge logged. Without the yes: the public profile in the host browser, or 5–10 pasted posts.
- **State the window you actually got** (e.g. "7 IG posts, Oct 5–12"). The server returns recent posts only, and some captions come back cut off mid-word: flag those.
- Rank by engagement relative to the account's own median, not absolute numbers. For the top and bottom posts (5 each with 15+ posts, 3 each below that), note the likely why: hook, format, topic, person featured, length, time.View the complete source on GitHubrun-organic-social-plan-calendar
When your agent uses it
Step of the run-organic-social playbook: turns the audit, research and dated moments into a two-week grid of empty post slots. Run run-organic-social instead; not for direct use.
What it loads into context
Frontmatter
64 tokensAlways available to the agent
SKILL.md
1,107 tokensWhen the skill is activated
Reference documents
7,329 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Procedure
- Output
Files
../run-memory/SKILL.mddoc18,060 bytesSKILL.mdcore4,600 bytesSKILL.mdcore4,600 bytesskill.meta.jsonasset419 bytes../run-organic-social/references/calendar-craft.mddoc11,763 bytes
Read SKILL.md
# Plan the calendar
Inputs: the account audit, the voice cards, `../run-organic-social/references/calendar-craft.md`, and these sibling artifacts (read each one that exists; never fake one that doesn't):
- **make-content's repurposed sets:** `gooseworks:file_list` `content/repurposed/` and `content/drafts/` (unslotted social cuts are the raw material).
- **This run's platform research** (`social/research/<date>-<platform>.md`): the patterns and examples every slot is modelled on, and the posting-time and format facts.
- **research-market's latest report** (the newest `research/market/<D>-read.md`): its "What people are saying" section — trends worth posting on, each with a post-by date, and the themes in people's words — and buyer language. Check the section's own date and window line first: research-market runs on ask or monthly, and a narrow run may cover only part of the market. A trend past its post-by date is stale; with no post-by date, a section older than 7 days is stale: use evergreen fallbacks. No such section → no trends from it.
- **plan-campaign:** `gooseworks:campaign_read` (list mode, then one campaign) for any campaign with an organic leg in the window.
- **analyze-performance's organic "what overperformed" read:** the latest `reports/performance/<date>.md`.
- **The brain:**
- When `brand_knowledge_*` tools are listed: reuse step 1's reads of chapters 19 "this week and what is coming", 20 "our plan" and 23 "what is working" (focus, live promotions, launches, what not to promote, past results); don't open them again. `gooseworks:brand_knowledge_search` for the seasonal calendar and for customer questions and phrases.
- Otherwise: `gooseworks:knowledge_search` for "this week's focus, live promotions, launches, what not to promote, seasonal calendar", and `source_types: ["evidence"]` for voice-of-customer questions and phrases.
- **The previous calendar:** `social/calendar/` (what went out, what's still queued).
- **The last run record** (the `run-memory` skill (`../run-memory/SKILL.md`) Start, loaded by SKILL.md): format tests still open, the per-format scorecard, and recommendations still open.
View the complete source on GitHubrun-organic-social-platform-research
When your agent uses it
Researches how one social platform works right now from dated sources (what gets reach, formats rising and fading, how small accounts get seen, recent changes) and finds what is getting watched in a given niche there, with linked examples and engagement read against each author's baseline. Use alone when you already have the platform and niche; otherwise run run-organic-social.
What it loads into context
Frontmatter
101 tokensAlways available to the agent
SKILL.md
3,319 tokensWhen the skill is activated
Reference documents
11,190 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. How the platform works right now (free, web search)
- 2. What is working in this niche on this platform
- 3. The brand's and the person's own accounts
- 3b. A model account: "tear down this one account" (when the marketer names one, or one account is clearly the pattern to learn from)
- 3c. Voices the buyer follows: the refill read
- 4. Output, kept for the report and the next run
Files
../marketing-data-access/SKILL.mddoc7,955 bytesSKILL.mdcore14,009 bytesSKILL.mdcore14,009 bytesSKILL.mdcore14,009 bytesSKILL.mdcore14,009 bytesskill.meta.jsonasset466 bytes../run-organic-social/references/platform-native.mddoc3,659 bytes../run-organic-social/references/post-checks.mddoc10,852 bytes../spend-gate/SKILL.mddoc6,102 bytes../spend-gate/proxy-endpoints.mddoc9,816 bytes../voice-card/SKILL.mddoc7,106 bytes
Read SKILL.md
# platform-research
Run this before planning or writing anything. Never plan a platform from memory. Platforms change their ranking, formats and what they push every few months, and the marketer will know if the plan is stale (e.g. "X is giving more reach to video now").
Do everything below for **each platform in scope**: the ones the marketer named, or the 2–3 recommended for them. Do it free first and ask nothing. The free pass ends in the draft report; paid reads only deepen it, after one credit yes.
## 1. How the platform works right now (free, web search)
Run web searches dated to the **last 6 months** (put the current month and year in the query):
- `<platform> algorithm <month> <year>`
- `<platform> reach video vs text <year>`
- `<platform> what's working <niche> <year>`
- `<platform> premium / verified reach replies <year>` (e.g. X Premium: its effect on reply ranking, reach and video length)
- the platform's own announcements, e.g. `<platform> creator update`, `<platform> engineering blog ranking`View the complete source on GitHubrun-organic-social-post-check
When your agent uses it
Checks a draft social post before it goes out: voice match against the account, would a person actually post it, AI-sounding phrases, claims against what the brand has signed off, banned words, disclosure and rights, trend timing, and whether a named person must approve it; rewrites weak drafts. Use alone when you already have the draft, the brand's voice and approved claims; otherwise run run-organic-social.
What it loads into context
Frontmatter
114 tokensAlways available to the agent
SKILL.md
1,093 tokensWhen the skill is activated
Reference documents
8,082 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
../ad-policy-check/disclosure.mddoc3,120 bytes../claims-gate/SKILL.mddoc15,033 bytesSKILL.mdcore4,668 bytesSKILL.mdcore4,668 bytesSKILL.mdcore4,668 bytesskill.meta.jsonasset464 bytes../run-organic-social/references/post-checks.mddoc10,852 bytes../run-organic-social/references/voice-card.mddoc4,457 bytes
Read SKILL.md
# Post check
Run on every slot's draft. The full checklists are in `../run-organic-social/references/post-checks.md`; the voice match test is in `../run-organic-social/references/voice-card.md`.
1. **Voice match:** the stylometric diff against the account's card, then the swap test, the read-aloud test and the line-up test.
2. **Share-worthiness and the founder test:** the share checklist and "Would a person actually post this?" (`../run-organic-social/references/post-checks.md` §1 and §1b). Write the share motive and the "Modelled on" example in the slot. A post with no proven pattern behind it, or with the product as the point, is rewritten or cut. This includes the **brand-risk question** ("could this make a buyer trust us less?") and, across the calendar, the **stranger test**: at least 3 in 10 useful to a stranger, at most half mainly about the product.
3. **AI-tells:** the blacklist, calibrated so anything the account's real posts use stays.
4. **Claims.** Run the shared claims gate (the `claims-gate` skill, `../claims-gate/SKILL.md`) on every slot. It loads the brand's claims contract, keeps, rewrites or cuts each brand claim, and runs the **scoped sign-off** when nothing is signed off: the 3–5 lines this calendar needs, asked once, in the draft-report message (SKILL.md step 2) for the whole plan, or before drafting for a single post. Here, apply the recorded answer to every slot. A line the marketer declined, or a drafted line outside the recorded answer, is cut or written as plain product facts. Never a second ask this run. Then the social-specific spans the gate doesn't own:
- **World facts and category education** ("a gentle cleanse helps the barrier") need a public source opened in this run, cited in the calendar file. Without one, cut them or turn them into a plain instruction that makes no factual claim.
- A claim must match the product in the slot. A press quote about a toner does not go on a spray post.
- The account's past posts, kit voice example lines and site copy are voice examples, never proof. Never lift a claim from an old caption.
5. **Banned words:** from the voice guide and the `dont` learnings.
6. **Disclosure and rights** (organic disclosure rules: `../ad-policy-check/disclosure.md` (in the `ad-policy-check` skill)): #ad or partnership labels, employee and founder material-connection disclosure, UGC permission and credit, contest rules, Commercial Music Library for TikTok brand accounts, **third-party IP and real people** (no unlicensed characters, franchises, logos or real people's names or likenesses, including user-made catalog items), and **age-sensitive** items kept off accounts that may reach minors.View the complete source on GitHubrun-paid-campaigns
When your agent uses it
Runs the paid leg of an approved plan: checks tracking, pages and stock before money moves, then stages one weekly proposal of kills, scales, pauses, swaps and launches, each with its reason and a check date. Nothing changes without your yes. Use when: launch these ads; it's Monday — kill, scale or pause?; swap this fatiguing ad; we sold out or the sale ended — pause the ads now; an ad got rejected or the account got restricted; we're in a brand crisis — hold the ads; give me the Google, TikTok or LinkedIn changes to make. Not for how the ads did or which ad won — use analyze-performance; not for rewriting a rejected image ad — use make-static-ads.
What it loads into context
Frontmatter
182 tokensAlways available to the agent
SKILL.md
4,199 tokensWhen the skill is activated
Reference documents
35,901 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
../marketing-guide/SKILL.mddoc17,316 bytes../run-memory/SKILL.mddoc18,060 bytes../run-paid-campaigns-apply-and-log/SKILL.mddoc4,751 bytes../run-paid-campaigns-draft-moves/SKILL.mddoc2,399 bytes../run-paid-campaigns-health-gate/SKILL.mddoc2,469 bytes../run-paid-campaigns-weekly-read/SKILL.mddoc2,121 bytesSKILL.mdcore18,316 bytesSKILL.mdcore18,316 bytesreferences/baseline-audit.mddoc2,693 bytesreferences/launch-and-graduate.mddoc7,889 bytesreferences/local-mode.mddoc2,831 bytesreferences/meta-levers.mddoc8,315 bytesreferences/moves.mddoc8,292 bytesreferences/proposal-and-log.mddoc20,042 bytesreferences/reading-results.mddoc8,048 bytesreferences/run-memory.mddoc19,148 bytesreferences/written-instructions.mddoc4,591 bytesskill.meta.jsonasset7,004 bytestests/test-by-hand.mddoc10,733 bytes../spend-gate/SKILL.mddoc6,102 bytes
Read SKILL.md
# run-paid-campaigns
## What you get
- **On the first run, an account baseline** — structure (ad sets under the learning floor, overlapping audiences), spend concentration by concept, creative age and mix, tracking state — which seeds the first moves (consolidation, rotation, fixes). `references/baseline-audit.md`.
- **Weekly moves proposal** (budgets in the marketer's currency) — in the report shape (`references/proposal-and-log.md`): In short (what a customer may cost, data window, what is and isn't visible), checks and pacing vs ceiling, **since last time** (each earlier move: done or not, and worked / didn't work / too early / can't tell, measured against the baseline stored when it was staged), then every move this week — scale / pause / hold / rotate / launch / graduate / fix / instructions — each with its evidence, confidence, what should happen, how it's applied and a check date. Near-threshold calls carry both readings and a trip-wire. Shape: `references/proposal-and-log.md`.
- **What to do: approve in three bundles** — approval links for Meta budget changes, swaps and launches (one approval each; GO LIVE typed for increases and live swaps), one sentence the marketer says for pauses, and written instructions for everything outside GooseWorks' reach. With the marketer's own ads connector, a card per change, each applied on its own named yes.
- **Change log** in the server's campaign-harness format — `ads/campaigns/<slug>/state.md` and `decisions.md` — so every approval, decline and pause is recorded and results trace back to decisions.
- **A run record** for next week (`references/run-memory.md`): the per-ad scorecard (top 10 by spend plus all others, with the trend since last run), every money move with its baseline recipe and verdict, and the open moves with their review dates — saved to the brand so the next run, the performance read and the replan all start from what happened.
## Before you start
1. **Setup first:** do the `marketing-guide` skill (`../marketing-guide/SKILL.md`) §1–2 (connect, brand, brain read) before anything else; the job line is "run your ads"; groups to load: meta, files, campaigns, automation. This playbook offers **local mode** (marketing-guide §5; what replaces each GooseWorks read and lever: `references/local-mode.md`). Pick the mode from what is listed:
- **GooseWorks connected** — the path below. An ads-platform connector the marketer also has fills what GooseWorks can't read (frequency, CPM, learning status, ads GooseWorks didn't make) and can change what GooseWorks has no lever for (step 3).View the complete source on GitHubrun-paid-campaigns-apply-and-log
When your agent uses it
Step of the run-paid-campaigns playbook: stages the week's approval items, applies only what the marketer approves and keeps the change log. Run run-paid-campaigns instead; not for direct use.
What it loads into context
Frontmatter
69 tokensAlways available to the agent
SKILL.md
1,199 tokensWhen the skill is activated
Reference documents
12,029 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Stage (step 7)
- Apply (step 8)
- Apply through a connector (any ads platform)
Files
SKILL.mdcore4,751 bytesskill.meta.jsonasset230 bytes../run-paid-campaigns/references/meta-levers.mddoc8,315 bytes../run-paid-campaigns/references/proposal-and-log.mddoc20,042 bytes../run-paid-campaigns/references/run-memory.mddoc19,148 bytes
Read SKILL.md
# Stage, apply and log (atom)
**Load:** `../run-paid-campaigns/references/meta-levers.md`, `../run-paid-campaigns/references/proposal-and-log.md` (exact grammar). **Steps by each move's lever** (the playbook's Before you start 3): GooseWorks levers — 1–8; connector levers — 1, 2, 4, then 9–11; written instructions — 1, 2, 4 (no tool call), then 7 on the marketer's "done". **Local mode** has only the last two and calls no `gooseworks:` tool; its files live under `gooseworks-local/<brand-slug>/` (host file tools).
## Stage (step 7)
1. Re-read `ads/campaigns/<slug>/state.md`. If it doesn't exist, create it with the frontmatter (`campaign`, `stage`, `goose_campaign_id`, `meta_push_ids: []`, `meta_campaign_id`, `updated_at`, `updated_by`; local mode: no ids), the header lines, `## Open recommendations` and `## Meta objects`.
2. Write each open move as one line `- R<n> (YYYY-MM-DD): <move> — evidence <…> — awaiting` under `## Open recommendations` (next free number; never reuse one), and its follow-up as `- R<n> check YYYY-MM-DD: <rule> · trip-wire <…>` under `## Checks due` (the server deletes bullets on close; checks must survive).
3. **GooseWorks levers only.** For each Meta budget change, swap or launch without an id yet: `gooseworks:propose_meta_budget_change` / `gooseworks:propose_meta_creative_replacement` (with `reason`, `evidence` as `report:<YYYY-MM-DD>` or `user request`, `recommendation_ref`), or `gooseworks:prepare_meta_ad_push` (with `goose_campaign_id`) then push status until it awaits approval. Put each returned change id in its bullet; **add each push id to `meta_push_ids` immediately** — the server finds this folder only through that list or `goose_campaign_id`. Never re-propose an item that already has an id.
4. Write the proposal in `proposal-and-log.md`'s one template (numbered moves, no ids) with the real approval links, the pause sentence and the cards; deliver it by its § Delivery, scheduled or not. Stop.
## Apply (step 8)
5. Pauses: `gooseworks:pause_meta_ad_push` only on the marketer's own words in this turn naming the ads (`user_instruction`), with `push_id` and `meta_ad_ids` from `## Meta objects`, and `recommendation_ref`. A bare "yes" → ask for the sentence. Report each ad's state after; anything not confirmed is named.
6. Links: read change or push status → approved / declined / waiting. Budget changes, swaps and pauses made with `recommendation_ref`: the server writes the `decisions.md` block and removes the bullet — never duplicate it. **Launches / graduations** (no `recommendation_ref` on `prepare_meta_ad_push`): when push status shows approved or declined, remove the bullet yourself and append a block with `Evidence: push:<id>` if none exists. Never say "done" early. A refused budget change (budget moved in Ads Manager): relay, re-read, never retry blind.
7. Instructions (cards), holds the marketer chose, declines given in chat, and check results (with the verdict word — worked / didn't work / too early / can't tell — in the Outcome line): re-read `decisions.md` immediately before writing, append a `### YYYY-MM-DD — <title>` block (Recommended / Evidence / Decided / Outcome, one line each, date never earlier than the newest block), then delete that recommendation's bullet from `state.md` (write `None.` if the section empties).View the complete source on GitHubrun-paid-campaigns-draft-moves
When your agent uses it
Step of the run-paid-campaigns playbook: turns the weekly read into scale, pause, hold, rotate and fix recommendations within the spend ceiling. Run run-paid-campaigns instead; not for direct use.
What it loads into context
Frontmatter
71 tokensAlways available to the agent
SKILL.md
568 tokensWhen the skill is activated
Reference documents
7,854 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore2,399 bytesskill.meta.jsonasset228 bytes../run-paid-campaigns/references/moves.mddoc8,292 bytes../run-paid-campaigns/references/run-memory.mddoc19,148 bytes../run-paid-campaigns/references/written-instructions.mddoc4,591 bytes
Read SKILL.md
# Draft the moves (atom)
**Load:** `../run-paid-campaigns/references/moves.md`, `../run-paid-campaigns/references/written-instructions.md`.
**Inputs:** the outcome check (each earlier move: worked / didn't work / too early / can't tell, from `../run-paid-campaigns/references/run-memory.md`); the weekly-read table; the health gate; allowable CPA and ceiling; month-to-date spend; last week's scored moves; picked creatives for swaps (the batch file's picks + lower-case tag `picked`), with their batch-file copy; analyze-performance's calls (including Google wasted-spend terms).
**Do:**
1. One recommendation per object that needs a move (an internal `R<n>`; the proposal numbers moves for the marketer); holds get a date and a trip-wire. Low-volume regime: a normal week is fixes + "no moves; next decision <date>".
2. Scale steps +20–30% against the implied daily pace; lifetime math for Goose launches; nothing in a flight's last 2 days.
3. One significant edit per ad set per week; drop the lower-confidence edit if two collide and say so. Pausing an ad doesn't save money unless its ad set budget is cut.
4. Near-threshold → both readings + recommendation + trip-wire.
5. Rotate before decay: swap to an approved render, else a rotation request — except in an ad set frozen until an earlier move's readout: there, a hold with a click-rate trip-wire (`../run-paid-campaigns/references/moves.md` § Freeze until read).
6. Everything outside GooseWorks' levers → a card.
7. Sum the effect on month-end spend; stay within the ceiling (cut the lowest-confidence scale first).View the complete source on GitHubrun-paid-campaigns-health-gate
When your agent uses it
Checks that ads are safe to spend on: conversion tracking recording, landing pages loading on mobile with the right product, price and offer, enough stock behind promoted products, no disapproved ads, and no account or payment stop. Marks each pass, fail or unknown and turns fails into fixes. Use alone when you already have the live or planned ads and their landing pages; otherwise run run-paid-campaigns.
What it loads into context
Frontmatter
113 tokensAlways available to the agent
SKILL.md
563 tokensWhen the skill is activated
Reference documents
2,489 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore2,469 bytesSKILL.mdcore2,469 bytesskill.meta.jsonasset255 bytes../run-paid-campaigns/references/launch-and-graduate.mddoc7,889 bytes../run-paid-campaigns/references/local-mode.mddoc2,831 bytes
Read SKILL.md
# Health gate (atom)
**Load:** `../run-paid-campaigns/references/launch-and-graduate.md` (health gate section).
**Inputs:** the chosen platforms (from the brief); the latest analyze-performance read (`reports/performance/`) — its data-quality flags and the platform-claims ÷ store-orders ratio; with GooseWorks, `meta_read` push status for each id in `state.md`'s `meta_push_ids` (per-creative failures, destinations; local mode: the connector's delivery and disapproval reads, `../run-paid-campaigns/references/local-mode.md`); destination URLs of other live ads (the marketer's export); stock on promoted SKUs (marketer or product record); live offers and their end dates (brief's Offer section, the marketer); the marketer's ads connector, when there is one (disapprovals, delivery status, whether the conversion event is recording).
**Do — in order, one line each, ✓ / ✗ / unknown:**
1. Tracking: conversions tracking store orders at a steady ratio (from analyze-performance), the connector showing the conversion event recording, or the marketer confirms it fires. Lead-gen: lead source captured in the CRM. Apps: SDK/MMP postbacks, SKAN/AEM set up. Unknown on a launch → ask; do not launch blind.
2. Destination: loads on mobile, right product, price matches the ad, offer valid, UTMs present. Open the page when the host can browse; else ask.
3. Stock: no ad sends traffic to a SKU with under ~1 week of cover.
4. Disapprovals / failed creatives (push_status; the connector; the marketer's export).
5. Account: (Meta chosen only) publishable Page exists; every platform: no known payment failure or spending-limit stop.
**Output:** the proposal's health line, plus fix moves (pause the affected Goose ad, a card for non-Goose objects, a written tracking fix). Any ✗ blocks launches and scale moves for that destination this week. Only a tracking break makes the window's numbers suspect; low stock or a disapproval does not invalidate past results.View the complete source on GitHubrun-paid-campaigns-weekly-read
When your agent uses it
Step of the run-paid-campaigns playbook: reads each platform's last mature results window against the allowable cost, as evidence for the week's moves. Run run-paid-campaigns instead; not for direct use.
What it loads into context
Frontmatter
72 tokensAlways available to the agent
SKILL.md
524 tokensWhen the skill is activated
Reference documents
7,381 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore2,121 bytesskill.meta.jsonasset228 bytes../run-paid-campaigns/references/local-mode.mddoc2,831 bytes../run-paid-campaigns/references/reading-results.mddoc8,048 bytes../run-paid-campaigns/references/run-memory.mddoc19,148 bytes
Read SKILL.md
# Weekly read (atom)
**Load:** `../run-paid-campaigns/references/reading-results.md`.
**Inputs:** the volume regime; `meta_read view: performance` (a 14-day and a 3-day window, ranked by spend) for Goose ads, when Meta is chosen and GooseWorks is connected (local mode: the connector's date-range reads, `../run-paid-campaigns/references/local-mode.md`); the marketer's exports for non-Goose Meta and other platforms; analyze-performance's weekly read (blended MER, new-customer CAC, store-joined CPA per angle, its kill/scale/hold calls); `decisions.md` (edits inside the window); the brief's test plan and targets.
**Do:**
1. Set the window for the regime (high-volume: 14-day minus the immature last 3 days; low-volume: 14–28 days matured past the qualified lag; app: 7–14 days past postback delay); same attribution setting as last week. Trends from trailing totals are approximate — say so.
2. State coverage: share of spend visible per platform; what is not visible (frequency, learning status, CPM unless exported).
3. Per ad set / ad, sorted by spend: spend, results, cost per result vs allowable, CTR trend over 3 weeks, conversions (n) and its noise band (±1/√n), learning (events/week vs ~50), and any edit inside the window. Traffic tests: CTR, cost per LPV, UTM store CVR.
4. Join to the blended read: does store-joined data agree with the platform? If not, the store-joined number decides and the disagreement is stated.
5. Mark each object: readable winner · readable loser · near-threshold · too early · broken.
6. Build the per-ad scorecard (`../run-paid-campaigns/references/run-memory.md` § End): top 10 by spend plus all others, each row against its row in the last run record.View the complete source on GitHubsave-learning
When your agent uses it
Shared step of the marketing playbooks (make-static-ads, analyze-performance, email-lifecycle, write-outreach): saves a short brand rule or finding in the human's own words, one idea per rule, retires the playbook's own older rules it replaces, and reads the result back to confirm. Loaded by those playbooks; not for direct use.
What it loads into context
Frontmatter
96 tokensAlways available to the agent
SKILL.md
2,499 tokensWhen the skill is activated
Reference documents
14,305 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When you may write one
- The text
- Steps: brain path (`brand_knowledge_*` tools listed)
- Steps: older path (no Brand Brain tools, or claims-gate's claim facts; one `brand_update` call per save)
- Long learnings (both paths)
Files
../claims-gate/SKILL.mddoc15,033 bytes../marketing-guide/SKILL.mddoc17,316 bytes../run-memory/SKILL.mddoc18,060 bytesSKILL.mdcore9,842 bytesSKILL.mdcore9,842 bytesSKILL.mdcore9,842 bytesskill.meta.jsonasset691 bytes../save-to-brain/SKILL.mddoc6,868 bytes
Read SKILL.md
# save-learning
Learnings are the brand's short rules. Every playbook writes them through this atom and nowhere else. There are two server paths, and this atom picks between them:
- **Brain path:** when the Brand Brain tools are listed (`brand_knowledge_*`). Save with `brand_knowledge_save`, read back with `brand_knowledge_read` / `brand_knowledge_search`. **Exception:** claims-gate's claim facts and marker always use the older path below.
- **Older path:** otherwise (older servers), and always for claims-gate's claim facts. Save with `gooseworks:brand_update` `patch.facts`, read back with `gooseworks:brand_read`.
- **Local mode** (no GooseWorks, [the `marketing-guide` skill](../marketing-guide/SKILL.md) §5): append to `gooseworks-local/<brand-slug>/brand-notes.md`, same opening, their words, dated. Read the file first; mark your own superseded line `retired <date>`; read it back.
The playbooks do not change between the paths.
Long evidence, tables and reports belong in a brand document (the `save-to-brain` skill (`../save-to-brain/SKILL.md`)); a learning is the rule or finding itself, in the human's words.
## When you may write one
- Only with the human's own words in `user_statement`: what they typed. An explicit approval such as "yes, save that rule" counts; your draft never goes there. On the older path also send `knowledge_intent: "user_correction"`; on the brain path, source `you`. Without their words, don't write it: put the finding in your document instead.View the complete source on GitHubsave-to-brain
When your agent uses it
Shared step of the marketing playbooks (research-market, plan-campaign, make-content, analyze-performance): saves a finished file to the brand and makes it searchable. It either replaces older versions or keeps dated history, then checks that the file can be found. Loaded by those playbooks; not for direct use.
What it loads into context
Frontmatter
88 tokensAlways available to the agent
SKILL.md
1,723 tokensWhen the skill is activated
Reference documents
4,369 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Inputs (the calling playbook supplies them)
- Brand Brain tools
- Workspace scope
- Steps
- If a tool is missing
Files
../marketing-guide/SKILL.mddoc17,316 bytesSKILL.mdcore6,868 bytesSKILL.mdcore6,868 bytesSKILL.mdcore6,868 bytesskill.meta.jsonasset691 bytes
Read SKILL.md
# save-to-brain
Every durable artifact goes through this atom. Never keep the only copy in chat or on the local disk, and never tell the marketer about workspaces, documents or imports — say "saved to your brand" or what failed in plain words.
**Local mode** (no GooseWorks, [the `marketing-guide` skill](../marketing-guide/SKILL.md) §5) is the one exception. It calls no `gooseworks:` tool, and `brand_id` and `coworker_agent_id` are not needed:
- **Host with files:** with the host's own file tools, read `gooseworks-local/<brand-slug>/<path>` if it exists, merge by step 1's rules (never-overwrite included), write it, and read it back. Skip steps 2–6. Say "saved in this folder", never "saved to your brand".
- **Hosted chat without files:** nothing can be saved. Give the whole file in chat under its path and say "This isn't saved anywhere: paste it back next time and I'll pick up from it." Skip steps 1–6.
## Inputs (the calling playbook supplies them)
| Input | Rule |
|---|---|
| `brand_id`, `brand_slug`, `coworker_agent_id` | From the `gooseworks:brand_read` list answer. |
| `path` | The playbook's own path in the marketing-guide's §4 table (`research/market/…`, `research/competitors/…`). Dates `YYYY-MM-DD`. |View the complete source on GitHubspend-gate
When your agent uses it
Shared step of the marketing playbooks (make-static-ads, research-market, run-paid-campaigns, work-with-creators): gets the human's yes before any credits are spent. Shows the price exactly as quoted, or asks for one yes to a credit ceiling for paid data reads, stays under it and logs each charge. Also covers scheduled runs. Loaded by those playbooks; not for direct use.
What it loads into context
Frontmatter
107 tokensAlways available to the agent
SKILL.md
1,400 tokensWhen the skill is activated
Reference documents
7,477 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- A. Engine-quoted work (ads, photos, video, any tool with a dry run or a price check)
- B. Proxy data reads (no price check exists) — one yes
- C. Scheduled runs (automations)
Files
../marketing-guide/SKILL.mddoc17,316 bytes../marketing-guide/research-pattern.mddoc1,828 bytesSKILL.mdcore6,102 bytesproxy-endpoints.mddoc9,816 bytesskill.meta.jsonasset700 bytes
Read SKILL.md
# spend-gate
No credit is spent before the human's yes in this conversation. Money is always a credit number exactly as GooseWorks gives it — never dollars, never your own total presented as a price. Never name tools, endpoints or vendors to the marketer: describe the work in plain words ("Reddit threads about dog allergies, newest first").
Pick the branch by the tool:
## A. Engine-quoted work (ads, photos, video, any tool with a dry run or a price check)
**Managed marketing data:** `marketing_data_describe` is free. `marketing_data_lookup` defaults to `quote_only: true`. Read the returned maximum credits and expiry, then request approval for that exact bounded work. Submit the same request with its quote token, the approved ceiling and the user’s words. A new request or expired quote needs a fresh quote. An existing approval may cover later calls only when it explicitly named that same bounded plan and total ceiling: quote each call, preserve the original approval words, and set its maximum no higher than the remaining approved credits. Ask again only for changed scope or more budget. Log every returned charge and deduct it before the next call; the tool’s per-call cap is not a cumulative plan limit. Free continuation pages inside that approved plan need no second spending approval. A capped quote is a maximum, not a claim about final usage. Never treat discovery, a successful quote or a fixture as proof that a paid data read ran.
1. Ask the tool for its quote (its dry run, `quote_only`, or `gooseworks:data_price_provider` for fal and ElevenLabs calls).
2. Show each quote exactly as given. Several quotes are shown one by one, never added up by you.
3. Ask for a yes to that quote. Submit only after it; a changed plan needs a new quote and a new yes.
4. If an answer comes back as a card waiting for a press, follow the server's card rule and wait for the human.View the complete source on GitHubvoice-card
When your agent uses it
Builds or updates a voice card from a company blog ("extract our blog voice") or how an account or person actually writes, measured from about 8 or more of their real posts (length, casing, emoji, openings, pet phrases, opinions with their source). When there are too few posts, it runs a short interview instead. It ends with a test that checks a draft against the card. The brand's rules always beat the card. Use alone when you already have the account's posts or the person on hand; otherwise run the playbook for the job (e.g. run-organic-social, write-outreach, email-lifecycle).
What it loads into context
Frontmatter
158 tokensAlways available to the agent
SKILL.md
1,764 tokensWhen the skill is activated
Reference documents
16,135 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choose the source
- Where it lives
- Precedence (non-negotiable)
- Read
- Build
- Update
- Match test (on every draft before it is shown)
- Named people
Files
../claims-gate/SKILL.mddoc15,033 bytes../marketing-data-access/SKILL.mddoc7,955 bytes../marketing-guide/SKILL.mddoc17,316 bytes../save-to-brain/SKILL.mddoc6,868 bytesSKILL.mdcore7,106 bytesSKILL.mdcore7,106 bytesSKILL.mdcore7,106 bytesSKILL.mdcore7,106 bytesreferences/blog-voice.mddoc4,808 bytesskill.meta.jsonasset655 bytestests/examples/2026-10-22/blog-voice.mddoc7,297 bytestests/fixtures/company-blog.mddoc6,997 bytestests/test-by-hand.mddoc2,486 bytes
Read SKILL.md
# voice-card
The brand voice (kit `voice` plus the brand's rules: every `dont` and `must` in its learnings) says what the brand may say and how it sounds overall. A **voice card** says how one account or person actually writes: lowercase or not, how long, which emoji, how they open. Adjectives ("warm, playful") don't stop generic copy; a card measured from real posts does.
## Choose the source
Used alone: first do the `marketing-guide` skill (`../marketing-guide/SKILL.md`) §1–2 (connection, brand and brain rules). Called from a writing job: reuse its setup. A company-blog or long-form voice ask follows `references/blog-voice.md` and returns; social posts and personal voice follow Build below. A blog guide is usable without releasing the full brand intake playbook.
## Where it lives
- One file per account or person: `brand/voices/<handle>.md`, brand coworker scope (`coworker_agent_id` from the `gooseworks:brand_read` list; no coworker → default workspace, path prefixed `brands/<brand-slug>/`).
- **Handle:** lower-case, hyphens, no `@`: `brand` (the brand's own voice across its accounts), `ig-<account>`, `tiktok-<account>`, `linkedin-<first-last>`, `founder-<first-last>`, `blog-<brand-slug>` (company long-form writing). One card per account where mechanics differ; accounts that write the same way share `brand`.
- Read before you write (`gooseworks:file_read`; `file_write` replaces the file). Save with the `save-to-brain` skill (`../save-to-brain/SKILL.md`) (`versioned: supersede`, title `Voice card <handle> — <Brand> — <YYYY-MM-DD>`, tags `[voice-card, voice-<handle>]`) so it is findable from any host. The tags name this atom, not the playbook that ran it: for save-to-brain's supersede rule, the creator is the first tag (`voice-card`), so any writer's newer card supersedes an older one.
View the complete source on GitHubwhere-to-start
When your agent uses it
First-move advice for a broad growth or marketing ask with no job named: looks at what GooseWorks already knows and at the site, asks a few short questions in one message, names the one thing in the way, and sends the marketer to the right next job. Use when the marketer says "help me grow my brand", "I need to grow my business", "how do I get more customers / sales", "help me with marketing", "where do I start", "sales are flat", "what should I focus on this month", or "I'm back, what's next?". Recommends only; never runs the work. Not for a named job like "make me ads" or "grow my Instagram" (go straight to it); not for a campaign with a launch, budget or date — use plan-campaign; not for why this week's numbers moved — use analyze-performance.
What it loads into context
Frontmatter
213 tokensAlways available to the agent
SKILL.md
2,906 tokensWhen the skill is activated
Reference documents
18,670 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
../marketing-guide/SKILL.mddoc17,316 bytes../where-to-start-situation-save/SKILL.mddoc3,450 bytesSKILL.mdcore12,687 bytesreferences/base-rates.mddoc5,224 bytesreferences/output-shape.mddoc7,180 bytesreferences/playbook-map.mddoc20,268 bytesreferences/questions.mddoc5,190 bytesreferences/situation-lens.mddoc9,977 bytesskill.meta.jsonasset3,281 bytestests/test-by-hand.mddoc10,166 bytes
Read SKILL.md
# where-to-start
This playbook frames the situation, holds it against the map of playbooks, and recommends a first move a senior advisor would stand behind. Judgment stays with you; the references make sure it looks at the right things.
Name each move by what it does ("set up your welcome and post-purchase emails"), using the "Say it as" names in `references/playbook-map.md`.
## What you get
A first-move recommendation on one screen: the read of the situation, the one constraint in the way, one or two moves (or a step the marketer takes plus one move alongside), what to bring, what not to do yet and why, a "worked if" with a number and a date, when to come back, and an offer of the next job in plain words. The marketer's answers are saved with the brand, so the next visit, the brand setup and the job they ask for next don't ask again.
## Before you start
1. **Setup first:** do the `marketing-guide` skill (`../marketing-guide/SKILL.md`) §1–2 (connect, brand, brain read) before anything else; the job line is "I look at what we already know about your business through it." Here: call `get_started` with `wants: "more"` and keep any card to one line; note each brand's `ad_library_ad_count` from the brand list. Never offer a partial list of brands as if it were all of them. A brand with no description and no research is an empty placeholder: treat it as no brand and don't write to it. Never start brand setup or research here.
2. **Is this really the confused ask?** A broad growth ask ("grow my brand", "get more customers or sales", "where do I start") is this playbook's job even when GooseWorks offers a campaign: never turn it into a campaign plan, ads or a calendar before these steps. If they name an outcome one playbook owns, or ask why this week's numbers moved on channels already running, offer that job straight away in plain words (`references/playbook-map.md`) and stop. If the direct ask is plainly blocked by something they said ("do ads" with no budget), still offer it, but name the blocker in one line and offer the first-move check instead.View the complete source on GitHubwhere-to-start-situation-save
When your agent uses it
Step of the where-to-start playbook: saves the founder's answers and the agreed first move with the brand, so later visits and other playbooks don't ask again. Run where-to-start instead; not for direct use.
What it loads into context
Frontmatter
71 tokensAlways available to the agent
SKILL.md
875 tokensWhen the skill is activated
Reference documents
1,723 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Input
- Steps
- Rules
Files
../save-to-brain/SKILL.mddoc6,868 bytesSKILL.mdcore3,450 bytesskill.meta.jsonasset412 bytes
Read SKILL.md
# situation-save
## Input
The founder's answers (their words), the brand (id, slug, `coworker_agent_id`) unless there is no real brand, what the short look at the site showed, the constraint you named, the recommendation and whether they agreed, and today's date.
No real brand (none, or an empty placeholder): save nothing, and say so plainly ("I can't save these yet — there's no brand set up"). If a brand is set up later in this same conversation, run this atom then, before anything else asks the founder again.
## Steps
1. **The situation file.** `gooseworks:file_read` `brand/situation.md` (brand coworker scope; no coworker → default workspace under `brands/<brand-slug>/`, and say so once). Replace the "Latest" section; move the previous "Latest" under "History" (keep the last three). Format:
```markdown
# Situation — <Brand>
Do this first, because: <the constraint in one clause> → <the agreed first move>.View the complete source on GitHubwork-with-creators
When your agent uses it
Real creators and influencers, researched, priced and briefed. Use when the marketer says "find influencers", "which creators are worth paying, at what price?", "find real UGC creators to film for our ads", "who should we seed product to", "is this creator's engagement real", "what should I pay this creator" or "write a creator brief". Free research first; one credit yes only to vet deeper. Drafts only: contacts nobody, agrees nothing, moves no money. Not for AI-made UGC-style video — use goose-video; if unsure, ask: a real person filming, or AI-made?
What it loads into context
Frontmatter
156 tokensAlways available to the agent
SKILL.md
3,236 tokensWhen the skill is activated
Reference documents
42,936 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
../claims-gate/SKILL.mddoc15,033 bytes../marketing-guide/SKILL.mddoc17,316 bytes../marketing-guide/research-pattern.mddoc1,828 bytes../outcomes-ledger/SKILL.mddoc11,207 bytes../run-memory/SKILL.mddoc18,060 bytes../save-learning/SKILL.mddoc9,842 bytes../spend-gate/SKILL.mddoc6,102 bytes../work-with-creators-brief-writer/SKILL.mddoc3,625 bytes../work-with-creators-creator-discovery/SKILL.mddoc2,571 bytes../work-with-creators-creator-vetting/SKILL.mddoc3,184 bytes../work-with-creators-rate-and-deal/SKILL.mddoc2,974 bytesSKILL.mdcore13,313 bytesreferences/creator-brief.mddoc9,187 bytesreferences/creators-by-company-type.mddoc3,943 bytesreferences/data-sources.mddoc6,041 bytesreferences/discovery.mddoc5,281 bytesreferences/first-message.mddoc2,936 bytesreferences/pricing-and-deals.mddoc9,553 bytesreferences/roster-format.mddoc9,183 bytesreferences/run-memory.mddoc3,960 bytesreferences/vetting.mddoc14,321 bytesreferences/wave-criteria.mddoc3,448 bytesskill.meta.jsonasset4,877 bytestests/test-by-hand.mddoc6,945 bytes../write-report/SKILL.mddoc8,986 bytes
Read SKILL.md
# work-with-creators
Creator research answers three things for the marketer: who is worth paying, at what price, and what they should make for *us*. The craft is in the references (`vetting.md`, `pricing-and-deals.md`, `creator-brief.md`); this file is the order of work. Research half only: it drafts; the marketer sends, negotiates, ships and pays.
**The rule that matters most: free pass first, report once** (`../marketing-guide/research-pattern.md` (in the `marketing-guide` skill) — read it before the first search). Before the first message, find real creators and read their public pages — web search, the host browser on TikTok, Instagram and YouTube, competitors' posts and partnership ads — and build a draft shortlist with public engagement numbers and a rough price range. The marketer's first message from you is that report plus the few decisions that change the answer. Paid reads only deepen the vetting, with one credit yes. Never ask a fact the free pass could find.
## What you get
1. **A readable report** (`creators/<YYYY-MM-DD>/report.md`, opened on request): "In short" (write-report §1) — timely openings (a creator already posting about the category this week, a rival's creator deal ending), the shortlist — each pick with public numbers read from real posts, dated and linked, and how sure (confirmed / likely / first look), a price range with the math, a deal call, and **For you** ("this creator's format fits your <product> because…; what they'd make; the approved claim behind it, or 'you'd need proof of X first'") — **You vs them** (rivals' creator programmes vs yours), wave 1 and how it will be judged, near-misses, Decisions for you (budget, names, claims, a deeper vet), and "what we could not read". Shape: [references/roster-format.md](references/roster-format.md).
2. **The roster** (`creators/roster.csv`, kept with the outcomes ledger) and **a brief and a first message per top pick** (`creators/<D>/briefs/<handle>.md`) — claims-safe, disclosure-ready, for the marketer to send: [references/creator-brief.md](references/creator-brief.md), [references/first-message.md](references/first-message.md), [references/wave-criteria.md](references/wave-criteria.md).
## Before you start
1. **Setup first:** do [the `marketing-guide` skill](../marketing-guide/SKILL.md) §1–2 (connect, brand, brain read) before anything else; the job line is "I find and check creators through it." (`get_started` with `wants: "more"`; when it asks which brand, ask in one line and call it again.) Then, for this playbook:View the complete source on GitHubwork-with-creators-brief-writer
When your agent uses it
Writes a one-page brief for one creator you have already picked: hook ideas in their format, at most three approved must-say lines, never-says, the disclosure for their platform, deliverables, timeline, the usage-rights ask and two examples. Adds a short first-message draft (gift and paid versions) for you to send. Use alone when you already have the creator, their best fitting post and the goal; otherwise run work-with-creators.
What it loads into context
Frontmatter
124 tokensAlways available to the agent
SKILL.md
851 tokensWhen the skill is activated
Reference documents
7,370 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
../ad-policy-check/disclosure.mddoc3,120 bytes../claims-gate/SKILL.mddoc15,033 bytesSKILL.mdcore3,625 bytesskill.meta.jsonasset467 bytes../work-with-creators/references/creator-brief.mddoc9,187 bytes../work-with-creators/references/first-message.mddoc2,936 bytes
Read SKILL.md
# brief-writer
**Reads:** the shortlisted creator's verdict and best on-brief post; the plan and goal; product records (facts); every claim-like line cleared through the `claims-gate` skill (`../claims-gate/SKILL.md`) (signed-off claims only; with no sign-off it asks the human for the few lines needed) and every `dont`/`must` fact; brand voice and kit only for the brand's own lines (never to rewrite the creator); `campaign_read` dates if a campaign drives it; `../work-with-creators/references/creator-brief.md`.
**Does:**
1. Fill every section of the brief, in order, on one page — the UGC-for-ads variant when the role is ugc-for-ads (hook variants as deliverables, shot list, CTA, raw footage, one creative revision), the seeding variant for gift-only creators (no required deliverable).
2. Must-says: at most three, each a signed-off claim quoted exactly (candidates from an unsigned brain never qualify). Lines not cleared by the claims gate are cut and listed with the proof that would restore them. Press-quote claims are cited as the publication's words, never as the creator's own experience. Product facts are neutral (format, size, ingredients, use) — never efficacy wording lifted from product pages.
3. Never-says: claims that are not signed off, banned words, regulated-category words, competitor names.
4. Hook angles written for this creator's format and style, from their own content — angles, not lines to read.
5. Disclosure lines for the creator's platform and market from `../ad-policy-check/disclosure.md` (in the `ad-policy-check` skill) — or the UGC-for-ads variant (brand-account ads; partnership label when run from the creator's handle; honest-use line). Mark a brief "not ready until you approve: <lines>" only when its message depends on lines the human hasn't approved; a brief on neutral facts and honest use is ready.
6. Rights ask marked "proposed, pending contract"; `[LINK]`, `[CODE]` and contact as placeholders for the human.
7. Examples: one of the creator's own fitting posts, one category winner for format (never a brand ad to copy).
8. Self-check before saving: one page; no script (UGC: hook variants and a shot list, still no read-out script); no claim that is not signed off in the key message, angles, must-says, can-cite, UGC hook variants or CTA; disclosure present; deliverables and dates concrete.
View the complete source on GitHubwork-with-creators-creator-discovery
When your agent uses it
Step of the work-with-creators playbook: builds and screens a long list of creators from fans, category creators and search, and ranks finalists to vet next. Run work-with-creators instead; not for direct use.
What it loads into context
Frontmatter
72 tokensAlways available to the agent
SKILL.md
595 tokensWhen the skill is activated
Reference documents
2,742 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore2,571 bytesSKILL.mdcore2,571 bytesSKILL.mdcore2,571 bytesskill.meta.jsonasset253 bytes../work-with-creators/references/data-sources.mddoc6,041 bytes../work-with-creators/references/discovery.mddoc5,281 bytes
Read SKILL.md
# creator-discovery
**Reads:** the plan (roles, platforms, tiers, geography); `brand_read` organic (the brand's and competitors' recent posts) and competitors; `social_inspiration_library` / `social_inspiration_search`; the existing roster (declined / never-again / already shortlisted); `../work-with-creators/references/discovery.md`; `../work-with-creators/references/data-sources.md`.
**Does:**
1. Free pass, all of it, before any paid read: creators tagged in or behind the brand's and rivals' recent organic posts (free in the brain; the founder's account for founder-led brands); rivals' partnership ads in the Meta Ad Library, read in the host browser; web search ("<category> creator tiktok", "best <concern> creators <year>", roundups and agency lists, "#ad <rival>", "<rival> partnership"); TikTok, Instagram and YouTube search, hashtag and profile pages in the host browser, read as a person would (no scripted paging); the brand's own tagged posts and brand-name mentions where the public page shows them (sentiment read); saved Inspiration outliers; creators the human named. An empty Inspiration library is normal — carry on.
2. Paid discovery only inside an approved top-up, to widen a thin free result: keyword and user search at volume, tagged posts behind a login, commenters under category leaders, lookalikes.
3. Long list: one line per creator — handle, platform, source, why surfaced. Open each profile before it goes on: the handle must match the name, niche and location the source gave (roundups often carry wrong handles).
4. Quick screen on the public profile (active ≤14 days, on-niche, language/geography, tier inside the plan, not a minor, bio and top posts clean, not declined/never-again).
5. Rank finalists by source strength (positive existing fans > proven in category > search) and screen notes; keep 10–25 for paid/UGC roles, 20–40 for a gift-only seeding wave in the free pass; mark each for full, light, UGC-rubric or B2B-branch vetting.
**Writes:** long list with screen results; finalist list with source, screen notes and vetting depth; in a top-up, the running sum of reported charges.
**Rules:** never rank on follower count. A creator found through one viral post goes forward only as "needs consistency check".View the complete source on GitHubwork-with-creators-creator-vetting
When your agent uses it
Vets creators you have already named from their public pages. Covers the median views of their last 12 to 20 posts (sponsored and organic apart), a read of their comments, how often they post, audience fit with how sure it is, about 12 months of brand-safety checks, rival partnerships and rules for regulated categories. Gives a verdict with dated numbers for each one. Use alone when you already have the creator handles and the brand's goal; otherwise run work-with-creators.
What it loads into context
Frontmatter
132 tokensAlways available to the agent
SKILL.md
726 tokensWhen the skill is activated
Reference documents
4,927 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore3,184 bytesskill.meta.jsonasset278 bytes../work-with-creators/references/data-sources.mddoc6,041 bytes../work-with-creators/references/vetting.mddoc14,321 bytes
Read SKILL.md
# creator-vetting
**Reads:** finalists; the persona and goal; signed-off claims and never-says (to spot conflicting past claims); competitor list; `../work-with-creators/references/vetting.md`; `../work-with-creators/references/data-sources.md`.
**Does, per finalist** — at the depth set in discovery (full, light, UGC rubric, B2B branch; see section 0 of the reference). **Free first:** everything below is done from the public profile and post pages in the host browser (reference §15 says what each platform shows logged-out), labelled "public-page read <date>". What a page hides (views on some platforms, comments behind a login, audience countries, transcripts) is listed for the paid top-up, never guessed.
1. Read the profile and the last 12–20 posts on the main platform; drop pinned, giveaway and too-fresh posts; split sponsored and organic.
2. Compute median views, view rate, engagement on the right basis for the platform, sponsored ÷ organic, mean ÷ median, cadence.
3. Read the visible comments on 2–3 posts in the free pass (50–100 across ~5 posts in a top-up); record the share of generic/bot-like comments, self-descriptions, purchase questions, language and place signals.
4. Audience fit: evidence and a confidence level (high / medium / low), from what people say about themselves — quoted and counted. Audience countries only for reach/install roles, top five at most. UGC-for-ads: skip audience; judge hooks (transcripts), product handling, past brand-ad work, portfolio, turnaround, honesty risk; mark delivery "not watched" and record 2–3 video links for the human.
5. Brand safety: one web name search per shortlisted pick is part of the free pass — always run it ("<name> scam / apology / drama / controversy"); then ~12 months of captions and a few transcripts; a name search with "scam / apology / drama / controversy" (if no search ran, the verdict says "captions and comments only"); past claims the brand could never make.
6. Conflicts: competitor partnership ads, competitor tags in the last 3–6 months.
7. Regulated and minors checks per the reference; any fail → out.
8. Write the verdict line (the shape at the end of the reference). Fails become near-misses with the number that failed.
View the complete source on GitHubwork-with-creators-rate-and-deal
When your agent uses it
Prices a creator you have already vetted. Gives a low and a target fee from median views and the platform's typical cost per 1,000 views, a walk-away ceiling from your goal and margin, and usage rights priced on their own. Checks against real quoted rates and recommends gift, paid, affiliate or a mix, with one line showing the math. Use alone when you already have the creator's recent view numbers, your goal and your unit cost; otherwise run work-with-creators.
What it loads into context
Frontmatter
131 tokensAlways available to the agent
SKILL.md
706 tokensWhen the skill is activated
Reference documents
2,465 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore2,974 bytesskill.meta.jsonasset276 bytes../work-with-creators/references/pricing-and-deals.mddoc9,553 bytes
Read SKILL.md
# rate-and-deal
**Reads:** verdicts; goal; budget; product unit cost / margin / AOV and any repeat-purchase data from the brain (or the human's answers); past quoted rates (roster, brain learnings); the creator's public media kit or advertise page if found; `../work-with-creators/references/pricing-and-deals.md`.
**Does, per creator:**
1. Base by role: reach/affiliate = median organic views ÷ 1,000 × the platform's CPM band (sponsored median if it is much lower); UGC-for-ads = per asset, with usage as the core fee; LinkedIn = per-post flat-fee band; newsletter/podcast = their published rate, or a conditional range pending the media kit.
2. Apply modifiers that apply (niche, geography, bundle, rush) → floor / target.
3. Price the rights ask separately: organic repost, paid usage / whitelisting term, exclusivity (UGC-for-ads: the per-asset fee includes 30-day usage; longer terms priced with the modifiers).
4. Walk-away ceiling from the goal (reference §6) — sales: organic first order, plus the rights-amplified value = (target CAC − expected CPA on the asset) × expected conversions (planned media ÷ expected CPA), both assumptions labelled; the two add when the deal buys both the post and the usage; awareness: ~2× the brand's paid-social CPM; content: the brand's cost per tested creative, else "no independent ceiling"; B2B: target cost per demo and contract value (asked, never defaulted; missing → "walk-away: not set" and the smallest test); apps: target cost per install or trial.
5. Real evidence beats benchmark: past quoted rates, the creator's media kit. Above ~1.5× benchmark → flag with reason.
6. Deal structure with the reason (gift-first / paid / affiliate / hybrid / UGC per-asset). Target above walk-away → change the structure or cut.
7. One line of math with every input marked "brand number" or "placeholder".
**Writes:** `price_floor, price_target, walk_away, rights_addon, deal_structure, deal_reason, price_math, real_rate_evidence`.View the complete source on GitHubwrite-outreach
When your agent uses it
Cold outreach a person sends to business buyers: email and LinkedIn sequences, a first line per prospect, reply and objection answers, and a read of replies. Use when the marketer says "write a cold email sequence", "what do I send to this list", "write LinkedIn messages for these leads", "how do I reply to this prospect" or "handle this objection", "reply to this demo request", "win back or reconnect with accounts that churned or went quiet", or "why is nobody replying to my outreach". Drafts only; the marketer sends from their own tool. Not for finding the people — use research-audience; not for emails to subscribers or users, or consumer win-back — use email-lifecycle.
What it loads into context
Frontmatter
181 tokensAlways available to the agent
SKILL.md
4,109 tokensWhen the skill is activated
Reference documents
38,843 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What you get
- Before you start
- Steps (sequences mode)
- Steps (replies and results)
- Approval gates
- Output and write-back
- Done when
- Out of scope
Files
../claims-gate/SKILL.mddoc15,033 bytes../marketing-guide/SKILL.mddoc17,316 bytes../outcomes-ledger/SKILL.mddoc11,207 bytes../run-memory/SKILL.mddoc18,060 bytes../save-learning/SKILL.mddoc9,842 bytes../save-to-brain/SKILL.mddoc6,868 bytes../voice-card/SKILL.mddoc7,106 bytes../write-outreach-draft-sequence/SKILL.mddoc3,685 bytes../write-outreach-outreach-qa/SKILL.mddoc2,499 bytes../write-outreach-reply-reader/SKILL.mddoc2,461 bytesSKILL.mdcore17,081 bytesSKILL.mdcore17,081 bytesreferences/angles-by-signal.mddoc7,481 bytesreferences/email-craft.mddoc5,830 bytesreferences/handoff-and-compliance.mddoc9,275 bytesreferences/linkedin-craft.mddoc3,461 bytesreferences/outreach-by-company-type.mddoc3,341 bytesreferences/reading-results.mddoc6,029 bytesreferences/replies-and-objections.mddoc4,934 bytesreferences/run-memory.mddoc6,158 bytesreferences/sequences.mddoc4,772 bytesskill.meta.jsonasset3,758 bytestests/test-by-hand.mddoc3,690 bytes../write-report/SKILL.mddoc8,986 bytes
Read SKILL.md
# write-outreach
Turns a list, or a buyer group, into words a founder or seller can send this week: **sequences per segment**, **a first line per person**, **replies and objection answers**, and later **what the replies say to fix**. The craft is in the references; this file is the order of work.
**The rule that matters most: write from evidence, send nothing.** Every first line rests on a dated fact about that person or account; every proof line is signed off; every message has one ask. The marketer sends from their own mailbox and tool, after warming it up — GooseWorks' own inbox is not a cold-email sender.
## What you get
1. **The outreach pack**, in the shape and checks of [the `write-report` skill](../write-report/SKILL.md). Outreach adds: the first move is who to send to first (with no list, that there is no one yet); decisions cover proof lines to sign off, the sender, the sending tool, daily volume and timing; with no list or on a first pack, the whole path and who does each step ([references/handoff-and-compliance.md](references/handoff-and-compliance.md) § The whole path); per segment the angle, the full sequence once (email and LinkedIn, with days) and 3 sample first lines; replies and objection answers; the before-you-send checklist with the one-line country summary; Sources say where each first line's facts came from and which proof was signed off and which cut. Every row's first line and finished messages go in the send file (and an appendix table when the marketer has no tool).
2. **A send file** the marketer imports into their tool (one subject and body column per touch, merge fields filled) — [references/handoff-and-compliance.md](references/handoff-and-compliance.md).
3. **Later, on request:** reply drafts for real replies, and a read of results — what to fix in targeting, timing or message.
## Before you start
View the complete source on GitHubwrite-outreach-draft-sequence
When your agent uses it
Step of the write-outreach playbook: the brief a helper follows to write one segment's email and LinkedIn sequence, first lines and replies from rows and an angle prepared earlier. Run write-outreach instead; not for direct use.
What it loads into context
Frontmatter
75 tokensAlways available to the agent
SKILL.md
924 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules
- Return this shape
Files
SKILL.mdcore3,685 bytesskill.meta.jsonasset241 bytes
Read SKILL.md
# draft-sequence
You are writing cold outreach for **one segment** of **one brand**. **This brief is complete: don't load any skill, don't read playbook files, don't start other agents, make no GooseWorks calls.** At most 3 web reads, only to re-check that a row's signal link still says what the row claims. Return in the shape at the end; no preamble.
**Inputs (in the prompt):** the brand, what it sells and its price; the sender (name, role); the segment and its angle — pain in the buyers' words (with the quote and link — or, with no quote bank, in our words labelled "not yet from buyers"), proof (a signed-off claim verbatim, or "proof needed: <what>"), the ask; the sequence shape (touches, channels, days); the rows (name, title, company, signal + URL + date, hook + URL, region flag, email status); the brand's `[outreach …]` rules and voice notes; today's date.
## Rules
- **Touch 1:** first line = the row's signal or hook and why it matters to the pain; then one or two lines on the pain and what we do (plain product fact, or the signed-off proof verbatim); one ask; sign-off with the sender's first name. 50–90 words. Subject under 50 characters, lower-case, plain.
- **Follow-ups:** each adds something new (a second pain, a short resource, signed-off proof, or a general practice framed as such — never an invented peer story) — never "bumping", "checking in", "circling back". 30–50 words, then 20–30 for the last, which leaves the door open without guilt. Same thread.
- **At most 6 touches in all** per person (e.g. 4 emails, the connection request, one LinkedIn message).
- **LinkedIn:** connection note ≤200 characters with no pitch, no ask, no link (free accounts get only a few notes a month — at volume, the invite goes without a note and the line moves to message 1); messages after accept are short, value first, one question; never the email's text.
- **First line per row:** built only on that row's facts. Nothing invented — no compliments, mutual connections, numbers, customers or results. No hook → write "no personal hook" and use the segment opener.
- **Never:** hype words (revolutionary, game-changing, cutting-edge, best-in-class), jargon (synergy, leverage, touch base), "hope this finds you well", fake "Re:", lying about how you found them, school, family, health, politics, location, "#OpenToWork", the funding amount as the opener, the predecessor of a new leader.View the complete source on GitHubwrite-outreach-outreach-qa
When your agent uses it
Step of the write-outreach playbook: the checks a finished outreach pack and send file must pass before delivery, covering facts, proof, compliance, length, asks and tone. Run write-outreach instead; not for direct use.
What it loads into context
Frontmatter
74 tokensAlways available to the agent
SKILL.md
602 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore2,499 bytesskill.meta.jsonasset238 bytes
Read SKILL.md
# outreach-qa
Run on the whole pack and the send file. Fix every failure, then run again. Nothing about the check goes into the pack itself.
**Facts and proof**
- Every first line rests on its row's signal or hook URL and date (`signal_1_date` / `hook_date`); the fact still says that (a sample of 5 rows re-checked by link, or every row when under 10).
- No invented compliment, mutual connection, number, customer, result, peer story, "brands like X", "most teams we talk to". Every proof line went through claims-gate; cuts are listed with the proof that would restore them.
- Prices and product facts match the brand's site or brain, with the date read.
**Compliance**
- Each email has the sender's name and company, a postal address placeholder the marketer fills once, and the opt-out line.
- Row rules applied: no email body for `UK-soletrader` (letter instead), non-published `CASL` / `AU-NZ`, Germany/Austria rows; unchecked and catch-all addresses sit in `email_to_check`, never `email`; EU and unknown-country first emails carry the source-and-object line; the one-line country summary is in the pack.
- Suppressed, cooled-down and duplicate rows are out of the send file, with counts.
View the complete source on GitHubwrite-outreach-reply-reader
When your agent uses it
Step of the write-outreach playbook: sorts outreach replies by type, matches each to its prospect row, sets that person's status and keeps useful exact words. Run write-outreach instead; not for direct use.
What it loads into context
Frontmatter
69 tokensAlways available to the agent
SKILL.md
602 tokensWhen the skill is activated
Reference documents
3,889 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
../outcomes-ledger/SKILL.mddoc11,207 bytesSKILL.mdcore2,461 bytesskill.meta.jsonasset433 bytes../write-outreach/references/replies-and-objections.mddoc4,934 bytes
Read SKILL.md
# reply-reader
**Reads:** the replies the marketer pasted or uploaded; `research/audience/ledger.csv`; the pack the replies answer (`outreach/<D>-<slug>/pack.md`); [`../write-outreach/references/replies-and-objections.md`](../write-outreach/references/replies-and-objections.md).
**Does:**
1. For each reply: the category (`interested · send-info · question · timing · using-rival · price · wrong-person · not-interested · how-did-you-get-this · no-show · stop · angry · out-of-office · bounce`), which touch it answered, and the person's exact words that matter (an objection, a pain phrase, a named rival, a date).
2. Match to the ledger row by email, then profile URL, then name + root domain (outcomes-ledger's keys). Unmatched replies are shown back, never guessed onto a row — a `stop`, `angry` or `bounce` from an unknown address gets a suppression-only row holding just its `key_hash`, the reason and the date (outcomes-ledger § Suppression without personal data); keeping the raw address needs the marketer's yes. The matched rows' `sequence_id` tells which pack the replies belong to.
3. The status it gives (replies-and-objections.md table): `replied`, `meeting`, `not-a-fit`, `unsubscribed`, `do-not-contact`, `bounced` — and `recontact_after` for `timing`. `stop`, `angry` and `bounce` are permanent suppressions.
4. One reply → hand back for the draft answer. A batch → counts by category, by touch and by segment for reading-results.md.
5. Pain phrases worth keeping → a request line in this pack's `results-working.md` (`Quote needed: for research-audience · <phrase, segment, date> · return to: outreach/<D>-<slug>/results-working.md`), with no name or email. Unnamed referrals → `Find needed:` lines there too.
**Writes:** the ledger through the `outcomes-ledger` skill (`../outcomes-ledger/SKILL.md`) (`entity: person`, statuses only from the replies the marketer gave — never inferred), and the category counts.
**Rules:** never mark anyone `contacted` or `replied` on inference; never draft a pitch to a `stop` or `angry` reply; no names, emails or reply text in the brand brain — counts and anonymised phrases only.View the complete source on GitHubwrite-report
When your agent uses it
Turns findings you already have into a report a marketer can read in 30 seconds. It has a short summary with key findings and how sure each one is, the first move, decisions needed, at most six next moves, what was not checked, and dated sources. It checks length and wording before handing over, then saves the report to the brand. Use alone when you already have the findings and their sources; otherwise run the playbook for the job (e.g. research-market, research-competitors, plan-campaign).
What it loads into context
Frontmatter
134 tokensAlways available to the agent
SKILL.md
2,237 tokensWhen the skill is activated
Reference documents
6,426 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Write for a human
- 2. Deliver it so it opens
- 3. Check before you hand it over
Files
../marketing-guide/SKILL.mddoc17,316 bytes../save-to-brain/SKILL.mddoc6,868 bytesSKILL.mdcore8,986 bytesSKILL.mdcore8,986 bytesSKILL.mdcore8,986 bytesexample-top.mddoc1,372 bytesskill.meta.jsonasset708 bytes
Read SKILL.md
# write-report
Every playbook that hands over research, a plan, a strategy or a report writes it through this atom.
## 1. Write for a human
**The 30-second test.** A marketer who reads only the top knows what you looked at, what you found and how sure you are, and what to do first — and can judge the move from the findings right above it. If not, rewrite the top.
**Shape, in this order:**
1. **Title**: what it is, for which brand, the date. Example: "GooseWorks — market research, 18 Oct 2026".
2. **In short**, **at most 150 words**, in this order:
- **What we looked at:** one line — scope, sources, date, and the main limit on the evidence (one review site, one country's search results, no access to the ad account).
- **2–3 numbered key findings**, each with its "so what" for this brand and how sure, in the body's own word: **confirmed** (two independent sources, or the brand's own data), **likely** (one good source or a clear pattern), **first look** (one sample, place or read; needs a re-check).
- **So, do this first (because of 1 and 2):** the one move, who does it, by when, naming the findings it rests on. When they are only a first look, or the move needs something not yet confirmed, the first move closes that gap (confirm X, run the test, get the data).View the complete source on GitHubad-angle-miner
When your agent uses it
Research supported advertising promises from a specific buyer's context, current product facts, customer language and observed ads. Turn them into static, video or copy ideas; match video ideas to actual recipes and save a product-scoped angle bank for write-video-ad-script. Product-led discovery can use verified facts without reviews. Reference persistence and reach are observations, not proof of performance.
What it loads into context
Frontmatter
82 tokensAlways available to the agent
SKILL.md
5,913 tokensWhen the skill is activated
Reference documents
2,036 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Prerequisites
- Phase 0: Intake
- Phase 1: Source Collection
- Phase 2: Angle Extraction
- Phase 2.5: Turn Each Angle Into an Ad
- Phase 3: Scoring & Ranking
- Phase 4: Output
- Phase 5: Make These (GooseWorks only)
- Tools Required
- Trigger Phrases
- Related
Files
SKILL.mdcore25,321 bytesSKILL.mdcore25,321 bytesSKILL.mdcore25,321 bytesSKILL.mdcore25,321 bytesSKILL.mdcore25,321 bytesSKILL.mdcore25,321 bytesSKILL.mdcore25,321 bytesSKILL.mdcore25,321 bytesSKILL.mdcore25,321 bytesreferences/buyer-and-product-role.mddoc2,544 bytesreferences/video-handoff.mddoc7,026 bytesskill.meta.jsonasset449 bytes
Read SKILL.md
# Ad Angle Miner
**Summary.** Research advertising promises and match them to creatives the brand can make.
Video research produces a structured bank the script writer can reuse, with stable angle ids,
separate product facts and customer language, and template compatibility. Research scores rank
test candidates; they do not predict conversions.
An ad is **copy plus creative**. This skill finds the angles real buyers respond to and turns each
into an ad idea the user can make:
- **Static**: a headline and primary text, plus a template from the live library whose layout fits the message.
- **Video**: a hook, plus a video format from the live catalogue and the observed posts that illustrate the pattern.
- **Copy only**: the headline and primary text lines, with no creative. Same evidence as static.
View the complete source on GitHubad-campaign-analyzer
When your agent uses it
Analyze ad campaign performance data (Google, Meta, LinkedIn) to identify what's working, what's wasting budget, and specific cut/scale/test recommendations. Runs statistical analysis, funnel diagnostics, and multi-channel budget reallocation with specific dollar-amount shift recommendations and scenario modeling.
What it loads into context
Frontmatter
72 tokensAlways available to the agent
SKILL.md
3,546 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Phase 0: Intake
- Phase 1: Data Ingestion & Normalization
- Phase 2: Performance Diagnostics
- Phase 3: Funnel Analysis
- Phase 4: Budget Reallocation
- Phase 5: Output Format
- Cost
- Tools Required
- Trigger Phrases
Files
SKILL.mdcore13,561 bytesskill.meta.jsonasset133 bytes
Read SKILL.md
# Ad Campaign Analyzer
Take raw campaign performance data and turn it into clear decisions. This skill doesn't just summarize metrics — it diagnoses problems, identifies winners, checks statistical significance, and tells you exactly what to cut, scale, and test next. Then it goes further: it compares channels on equal terms, finds where you're over-spending vs under-spending relative to results, and produces a concrete budget reallocation plan.
**Core principle:** Most startup founders check their ad dashboard, see a ROAS number, and either panic or celebrate. This skill gives you the nuanced analysis a paid media specialist would: what's actually significant, what's noise, and where your next dollar should go. It also solves the allocation problem — most startups either spread budget too thin across channels (no channel gets enough to learn) or dump everything into one channel (missing cheaper opportunities elsewhere).
## When to Use
- "Analyze my Google Ads performance"
- "Which ads should I kill?"
- "Is this campaign working?"
- "Where am I wasting ad spend?"
- "Optimize my Meta Ads"
- "How should I split my ad budget?"View the complete source on GitHubad-lead-quality-analyzer
When your agent uses it
For paid lead-gen and participant-recruitment ads, replaces vanity CPA with true CAC per qualified lead by joining ad-platform data with downstream funnel events, surfaces tracking gaps, and classifies every creative into Scale / Keep / Investigate / Cut.
What it loads into context
Frontmatter
60 tokensAlways available to the agent
SKILL.md
2,642 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Pipeline Pattern Assumptions (Read First)
- Phase 0: Discovery Interview
- Phase 1: Tracking Validation (Gating Step)
- Phase 2: Build the Per-Creative Funnel
- Phase 3: Compute True CAC
- Phase 4: Score and Classify Each Creative
- Phase 5: Cohort Maturation Handling
- Phase 6: Generate Report
- Tracking-Gap Mode (Output if Phase 1 Fails)
- Output Standards (Mandatory)
- What This Skill Will Not Do
- Related Skills
Files
SKILL.mdcore11,004 bytesSKILL.mdcore11,004 bytesSKILL.mdcore11,004 bytesskill.meta.jsonasset137 bytes
Read SKILL.md
# Ad Lead Quality Analyzer
Meta optimizes for whatever conversion event you fire. For lead-gen and participant-recruitment campaigns that's almost always "signup" — but a signup is worthless if the lead never qualifies, never completes the requested action, or never gets paid out. The lowest-CPA campaign is often the one bringing in the *worst* leads.
This skill joins what the ad platform knows (spend, signups) with what your own product knows (downstream funnel) and replaces vanity CPA with **true CAC per qualified lead**. It then classifies every creative into actionable buckets so you stop scaling the wrong winners.
**Core principle:** The ad platform's CPA is a half-truth. Real optimization needs both halves of the funnel — pre-signup (the platform has it) and post-signup (you have it). Until they're joined, you're flying blind.
## When to Use
- "Which ads are bringing in real leads vs. junk?"
- "True CAC per qualified contributor / customer / participant"
- "Why is my lowest-CPA campaign performing worst downstream?"
- "Audit lead quality across creatives / audiences / placements"View the complete source on GitHubad-management-intake
When your agent uses it
The intake stage of a Meta ad harness. Researches the brand first, states what it assumes, and asks only what it cannot infer and what would change money, claims or legal exposure if guessed wrong — at most four questions a turn, in plain business language. Writes the brand's stable facts (ads/brand.md), the campaign brief, and a log of what was asked vs assumed. Use it when someone wants to run Meta ads and the brand's ad facts are not yet recorded.
What it loads into context
Frontmatter
108 tokensAlways available to the agent
SKILL.md
4,223 tokensWhen the skill is activated
Reference documents
3,114 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Where this skill's files are
- Choose one mode
- Inputs
- Workflow
- Business-type examples
- How to talk
- Decision Rules
- Output
- Quality Checks
- Failure Modes
Files
SKILL.mdcore17,727 bytesSKILL.mdcore17,727 bytesSKILL.mdcore17,727 bytesagents/openai.yamlasset242 bytesreferences/business-types.mddoc3,439 bytesreferences/gooseworks-adapter.mddoc7,188 bytesreferences/local-adapter.mddoc2,464 bytesskill.meta.jsonasset745 bytes
Read SKILL.md
# Ad Management Intake
**What this does.** Someone says "I want to run ads on Meta." A good agency would not hand them a
twenty-field form. It would read their website first, come back with "here's what I think your
business looks like", and ask only the few things it cannot know and cannot afford to get wrong.
This skill is that conversation.
**The one rule.** Ask a question only when **both** are true:
1. **It cannot be inferred.** The brand's research, its product catalog and its past campaigns
do not answer it.
2. **A wrong guess costs something real.** Assuming wrong would change **money** (budget, price,
what a customer is worth), **claims** (what an ad may say), or **legal exposure** (regulated
words, restricted categories, audiences that must be excluded).View the complete source on GitHubads-north-star-strategy
When your agent uses it
Turn a brand's facts, a campaign brief and the product into a one-minute Meta ad strategy with its reasoning — goal, audience, objective and placements, budget split, how many ads and how different they must be (generate 3x so the user can choose), the test frame, the success metric, and safety rules for the user to accept. Decides what launch-meta-ad-campaign then executes, and re-reads the strategy after a deep check to show which assumption changed. Use it after intake and before any creative is generated or any campaign is built.
What it loads into context
Frontmatter
125 tokensAlways available to the agent
SKILL.md
4,722 tokensWhen the skill is activated
Reference documents
2,346 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Where this skill's files are
- Choose one mode
- Purpose
- Inputs
- Composed Atoms
- Workflow
- Decision Rules
- Output
- Quality Checks
- Failure Modes
Files
SKILL.mdcore20,002 bytesSKILL.mdcore20,002 bytesagents/openai.yamlasset250 bytesreferences/direct-meta-adapter.mddoc2,121 bytesreferences/gooseworks-adapter.mddoc6,549 bytesreferences/planning-only.mddoc1,369 bytesskill.meta.jsonasset885 bytes
Read SKILL.md
# Ads North Star Strategy
**What this is for.** Intake produced facts: what the business sells, what a customer is
worth, how long they take to buy, what the user wants from this money. This skill turns them
into a strategy the user can read in a minute. Each choice comes with its reason, because
the deep check re-reads this file weeks later and has to see what was assumed.
**This skill decides. `launch-meta-ad-campaign` executes.** The launch skill already holds
the rules for what to optimize for, how big a test the budget buys, and how to structure the
campaign. This skill **applies** those rules and records the answer. It does not restate
them. When they change, they change in one place.
**The three things most strategies get wrong:**
View the complete source on GitHubanswer-ads-questions
When your agent uses it
Answer questions about a brand's Meta ads (spend, results, which ad is winning, is it paused, why did Goose do that) only from reads made in the same turn, with the data window and sync time on every number and a plain caveat when the connection is stale or partial. Use it whenever a user asks how their ads are doing or why an ad action was taken.
What it loads into context
Frontmatter
90 tokensAlways available to the agent
SKILL.md
3,089 tokensWhen the skill is activated
Reference documents
3,191 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Where this skill's files are
- Choose one mode
- Purpose
- Inputs
- Workflow
- Output
- Quality Checks
- Failure Modes
Files
SKILL.mdcore12,506 bytesSKILL.mdcore12,506 bytesSKILL.mdcore12,506 bytesSKILL.mdcore12,506 bytesSKILL.mdcore12,506 bytesSKILL.mdcore12,506 bytesagents/openai.yamlasset231 bytesreferences/direct-meta-adapter.mddoc3,285 bytesreferences/gooseworks-adapter.mddoc7,932 bytesreferences/planning-only.mddoc1,044 bytesskill.meta.jsonasset763 bytes
Read SKILL.md
# Answer Ads Questions
**In one line:** answer "how are my ads doing?" from a tool you called this turn, say which
days the numbers cover and when they were last synced, and say out loud when the data is
incomplete.
- **Numbers come from tools, never from memory or the docs.** The `ads/` docs explain *why*
Goose did something. They are not a source of metrics.
- **Every number carries its window and sync time.** "You spent $212 from Sep 17 to Sep 23
(data last synced Sep 24, 09:00 UTC)."
- **Partial, stale or disconnected data is said straight after the answer**, never buried or left out.
- **This skill only reads.** It never pauses, changes or writes anything.
## Where this skill's files areView the complete source on GitHubbrand-research
When your agent uses it
Research a company or brand from its website and produce a reusable Brand Core covering products, audience, competitors, positioning, offers, messaging evidence, voice, and visual identity. Use before growth, ad, content, creator, or product work when reliable brand context is missing.
What it loads into context
Frontmatter
62 tokensAlways available to the agent
SKILL.md
1,377 tokensWhen the skill is activated
Reference documents
2,020 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Inputs
- Brand Core output
- Workflow
- `brand-core.json`
- Quality checks
Scripts executed separately
scripts/fetch_asset.pyscripts/lib.pyscripts/register_asset.pyscripts/render_product_shot.pyscripts/scaffold_brand.pyscripts/verify_pack.py
Files
.env.exampleasset607 bytesREADME.mddoc2,813 bytesSKILL.mdcore6,511 bytesSKILL.mdcore6,511 bytesSKILL.mdcore6,511 bytesSKILL.mdcore6,511 bytesSKILL.mdcore6,511 bytesSKILL.mdcore6,511 bytesSKILL.mdcore6,511 bytesexamples/notion-calendar-with-ads.mddoc1,127 bytesexamples/oatly-oat-milk.mddoc997 bytesreferences/output-contract.mddoc3,194 bytesrequirements.txtdoc249 bytesscripts/fetch_asset.pyruns2,596 bytesscripts/lib.pyruns3,782 bytesscripts/register_asset.pyruns1,178 bytesscripts/render_product_shot.pyruns2,586 bytesscripts/scaffold_brand.pyruns2,795 bytesscripts/verify_pack.pyruns7,131 bytesskill.meta.jsonasset296 bytes
Read SKILL.md
# Brand Research
Build a sourced **Brand Core** that future research, analysis, and creative workflows can reuse without rediscovering the company every time.
The required path is research-only and works with local files. GooseWorks sync, ad imports, and paid asset generation are optional extensions—not prerequisites for a complete result.
## Inputs
- `website` — required canonical company or brand website.
- `focus` — optional product, collection, market, or campaign to prioritize.
- `output_dir` — optional; defaults to a clearly named local brand folder.
- `depth` — `quick` or `full` (default `full`).
- `sync_to_gooseworks` — optional, default false.
- `include_existing_ads` — optional, default true in full mode.View the complete source on GitHubcomment-mining
When your agent uses it
Mine comments and replies on social posts, videos, and ads for recurring customer language, questions, objections, desired outcomes, complaints, product requests, purchase signals, and creative opportunities. Use for voice-of-customer research grounded in linked source evidence.
What it loads into context
Frontmatter
57 tokensAlways available to the agent
SKILL.md
422 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Inputs
- Workflow
- Output
Files
SKILL.mdcore2,162 bytesSKILL.mdcore2,162 bytesSKILL.mdcore2,162 bytesSKILL.mdcore2,162 bytesSKILL.mdcore2,162 bytesskill.meta.jsonasset215 bytes
Read SKILL.md
# Comment Mining
Turn public comment threads into evidence a growth team can use.
## Inputs
- Brand/product and research question.
- Post, reel, video, or ad URLs; or creators/competitors to sample.
- Target market, platforms, time window, and desired sample size.
## Workflow
1. Use `scrapecreators-api` to collect post context, top-level comments, and replies from the relevant platforms. Sample across multiple posts and creators instead of overfitting to one viral thread.
2. Preserve parent-and-reply context where it changes meaning. Remove obvious spam, duplicate comments, tag-only replies, and giveaways unless they are the subject of the study.View the complete source on GitHubcompany-contact-finder
When your agent uses it
Find decision-makers at a specific company using Fiber, Crustdata and PDL people search inside the GooseWorks coworker. Given a company name and target titles, returns a list of contacts with name, title, LinkedIn URL, and location.
What it loads into context
Frontmatter
65 tokensAlways available to the agent
SKILL.md
2,926 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Where this runs
- Spend rule
- Inputs
- Procedure
- People-search tools reference
- Examples
- Troubleshooting
- Metadata
Files
SKILL.mdcore11,509 bytesSKILL.mdcore11,509 bytesskill.meta.jsonasset161 bytes
Read SKILL.md
# company-contact-finder
Find decision-makers at a specific company by name and target titles. Uses the GooseWorks coworker's people-search tools (Fiber, Crustdata, PDL) with a layered fallback, so you only pay for the next source when the last one came up short.
## Where this runs
**This skill runs only inside the GooseWorks coworker** (the coworker in the GooseWorks app). The people-search tools it uses exist only there. They are not on the GooseWorks server that Claude, ChatGPT and other outside agents connect to.
If `fiber_person_search`, `crustdata_person_search` and `pdl_person_search` are not in your tool list, you are outside the coworker. Tell the user that this contact search runs only inside the GooseWorks coworker, and stop. Do not try other tools in their place.
## Spend rule
Every search in this skill is paid. **Before each paid search or page, tell the customer what it costs and wait for their yes.**
View the complete source on GitHubcompetitor-ad-intelligence
When your agent uses it
Scrape competitor ads from Meta, TikTok, Google, and LinkedIn ad libraries, analyze creative patterns (hooks, formats, CTAs), reverse-engineer landing page funnels, and produce a strategic teardown with vulnerability analysis and counter-play recommendations. Use when you need to understand the competitive ad landscape, find new creative directions, or identify weaknesses in a competitor's paid strategy.
What it loads into context
Frontmatter
90 tokensAlways available to the agent
SKILL.md
4,210 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Phase 0: Intake
- Phase 1: Scrape Meta Ads
- Phase 2: Scrape TikTok Ads
- Phase 3: Scrape Google Ads
- Phase 4: Scrape LinkedIn Ads
- Phase 5: Analyze Creative Patterns
- Phase 6: Landing Page & Funnel Analysis
- Phase 7: Strategic Analysis
- Phase 8: Output
- Tools Used
- Trigger Phrases
Files
SKILL.mdcore17,803 bytesSKILL.mdcore17,803 bytesskill.meta.jsonasset264 bytes
Read SKILL.md
# Competitor Ad Intelligence
Scrape competitor ads from Meta, TikTok, Google, and LinkedIn, analyze creative patterns, reverse-engineer landing page funnels, and produce a full strategic teardown — hooks, formats, positioning bets, vulnerabilities, and counter-plays.
**Core principle:** A competitor's ad portfolio is evidence about its growth strategy, not access to its results. Long-running ads suggest sustained use. New ads suggest active testing. Landing pages reveal positioning bets. Use these signals to form differentiated tests without claiming conversion, spend, or causality the libraries do not expose.
## When to Use
- "What ads are my competitors running?"
- "Tear down [competitor]'s ad strategy"
- "Find new creative angles for our paid campaigns"
- "Reverse-engineer [competitor]'s paid funnel"
- "What hooks are working in [our space]?"
- "Audit the ad landscape before we launch"View the complete source on GitHubget-brand-assets
When your agent uses it
Get company logos, brand colors, fonts, and style guides
What it loads into context
Frontmatter
20 tokensAlways available to the agent
SKILL.md
1,252 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Setup
- When to Use
- How It Works
- Usage
- Parameters
- Response
- Examples
- Tips
Files
SKILL.mdcore4,506 bytesSKILL.mdcore4,506 bytesSKILL.mdcore4,506 bytesSKILL.mdcore4,506 bytesSKILL.mdcore4,506 bytesSKILL.mdcore4,506 bytesSKILL.mdcore4,506 bytesSKILL.mdcore4,506 bytesSKILL.mdcore4,506 bytesSKILL.mdcore4,506 bytesskill.meta.jsonasset135 bytes
Read SKILL.md
# Get Brand Assets
## Setup
Read your credentials from ~/.gooseworks/credentials.json:
```bash
[Credential-related source omitted]
export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))")
```
If ~/.gooseworks/credentials.json does not exist, tell the user to run: `npx gooseworks login`
[Credential-related source omitted]View the complete source on GitHubgoose-graphics
When your agent uses it
Portable visual skill pack for the Agent Skills ecosystem (Claude Code, Claude Desktop, Claude Cowork, Claude Design, Goose, Cursor, Codex). Discovers community-published styles + formats via the gooseworks CLI, runs an extract-style workflow on reference images, and exports rendered PNGs via Playwright.
What it loads into context
Frontmatter
70 tokensAlways available to the agent
SKILL.md
5,092 tokensWhen the skill is activated
Reference documents
11,946 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Overview
- 2. Invocation
- 3. Discovering styles and formats
- 4. Publishing your style
- 5. Publishing your format
- 6. Host compatibility
- 7. First-Run Setup
- 8. Interactive Workflow
- 9. Step 1: Discover Intent
- 10. Step 2: Select Style
- 11. Step 3: Image Sources (Optional)
- 12. Step 4: Output Path
- 13. Step 5: Generate HTML
- 14. Step 6: Screenshot
- 15. Step 7: Deliver
- 16. Special Modes
- 17. Manifest format
- 18. File reference
Scripts executed separately
screenshot/fetch-full-tweet.jsscreenshot/fetch-tweet.jsscreenshot/package.jsonscreenshot/screenshot.js
Files
README.mddoc4,972 bytesSKILL.mdcore20,820 bytesSKILL.mdcore20,820 bytesSKILL.mdcore20,820 bytesSKILL.mdcore20,820 bytesSKILL.mdcore20,820 bytesSKILL.mdcore20,820 bytesSKILL.mdcore20,820 bytesSKILL.mdcore20,820 bytesSKILL.mdcore20,820 bytesSKILL.mdcore20,820 bytesSKILL.mdcore20,820 bytesSKILL.mdcore20,820 bytesextract-style.mddoc18,338 bytesscreenshot/.gitignoreasset13 bytesscreenshot/fetch-full-tweet.jsruns3,712 bytesscreenshot/fetch-tweet.jsruns7,366 bytesscreenshot/package-lock.jsonasset1,700 bytesscreenshot/package.jsonruns237 bytesscreenshot/screenshot.jsruns11,515 bytesskill.meta.jsonasset559 bytessources/ascii-art.mddoc12,558 bytessources/unsplash.mddoc10,700 bytes
Read SKILL.md
## 1. Overview
`goose-graphics` is a portable visual skill pack for the Agent Skills ecosystem. Styles and formats live in the central Gooseworks library — fetched on demand via `npx gooseworks` instead of bundled into this repo. The skill pairs that catalog with an extract-style workflow for reference images, an Unsplash + ASCII art image-sourcing layer, and a Playwright-based HTML-to-PNG export pipeline.
It loads in any host that reads `SKILL.md` — Claude Code agents calling it for automated render, Goose pipelines wiring it into content generation, Cursor/Codex projects picking it up via `.cursor/rules/` or `~/.codex/skills/`. Each style ships a slim DESIGN.md spec via `npx gooseworks styles get <slug>`, which can also be uploaded directly into Claude Design as a design-system scaffold.
Format templates, image-sourcing helpers, and the screenshot pipeline live in this skill pack. Styles, formats, and example renders are fetched on demand from the central library — no slugs are baked in.
## 2. Invocation
This skill supports **three invocation modes** — all-args, partial-args, and interactive. Pick the fastest path for the ask.
### 2.1 Full-args invocation (fastest path)
View the complete source on GitHubgoose-graphics-create-format
When your agent uses it
Creates a new graphics format spec (custom canvas dimensions + content rules) and publishes it to the Gooseworks library so any agent can render against it. Use when the existing community formats (carousel, story, infographic, slides, poster, chart, tweet, plus community additions) don't fit the user's canvas — e.g., LinkedIn banner 1584×396, story cover 1080×1920, event flyer 8.5×11in. Mirrors goose-graphics-create-style but for formats.
What it loads into context
Frontmatter
119 tokensAlways available to the agent
SKILL.md
3,327 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to use this skill
- Prerequisites
- Inputs
- Outputs (in a working directory)
- Workflow
- Description-writing guidelines
- Tag-writing guidelines
- Anti-patterns to avoid
Files
SKILL.mdcore13,306 bytesSKILL.mdcore13,306 bytesSKILL.mdcore13,306 bytesSKILL.mdcore13,306 bytesSKILL.mdcore13,306 bytesSKILL.mdcore13,306 bytesskill.meta.jsonasset526 bytes
Read SKILL.md
# Create Goose Graphics Format
Authors a new graphics format and publishes it to the central Gooseworks library
via `npx gooseworks formats publish`. The output is a working directory with a
`gooseworks-format.json` manifest plus at least one rendered example PNG paired
with an existing style.
## When to use this skill
Use when the user wants a new named format with its own content rules —
a story cover, a podcast cover, a square testimonial — that maps to one
of the seven built-in canvas sizes (carousel, infographic, slides,
poster, story, chart, tweet). The new format defines new rules and a
new slug; it inherits dimensions from one of those canvases.View the complete source on GitHubgoose-graphics-create-style
When your agent uses it
End-to-end skill that turns a single reference image into a published Gooseworks style — analyzes the image, drafts the slim style spec, renders a hero example plus 2-3 additional formats via Playwright, writes the `gooseworks-style.json` manifest, and publishes via `npx gooseworks styles publish` so other agents can discover it. Mirrors goose-graphics-create-format but for styles.
What it loads into context
Frontmatter
103 tokensAlways available to the agent
SKILL.md
4,415 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to use this skill
- Prerequisites
- Invocation
- Outputs (in a working directory)
- Standard Brief
- Workflow
- Description-writing guidelines (load-bearing)
- Tag-writing guidelines
- Notes on existing patterns to reuse
- Anti-patterns to avoid
Files
SKILL.mdcore17,332 bytesSKILL.mdcore17,332 bytesSKILL.mdcore17,332 bytesSKILL.mdcore17,332 bytesSKILL.mdcore17,332 bytesSKILL.mdcore17,332 bytesSKILL.mdcore17,332 bytesskill.meta.jsonasset571 bytes
Read SKILL.md
# Create Goose Graphics Style
Authors a new graphics style and publishes it to the central Gooseworks
library via `npx gooseworks styles publish`. The output is a working
directory with a `gooseworks-style.json` manifest plus a hero rendered
example and 2-3 additional examples that demonstrate the aesthetic flexing
across formats.
## When to use this skill
Use when the user has a reference image and wants the aesthetic available
as a reusable, discoverable style — so any future
`/goose-graphics --style <slug> --format <any>` call can render against it.
View the complete source on GitHubhacker-news-scraper
When your agent uses it
Search Hacker News stories and comments using the free Algolia API. No Apify token needed. Use when you need to find HN discussions, track mentions, discover Show HN launches, or monitor tech community sentiment.
What it loads into context
Frontmatter
58 tokensAlways available to the agent
SKILL.md
590 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Start
- How the Script Works
- CLI Reference
- Output Format
- Cost
Scripts executed separately
scripts/search_hn.py
Files
SKILL.mdcore2,149 bytesSKILL.mdcore2,149 bytesSKILL.mdcore2,149 bytesSKILL.mdcore2,149 bytesSKILL.mdcore2,149 bytesscripts/search_hn.pyruns5,571 bytesskill.meta.jsonasset148 bytes
Read SKILL.md
# Hacker News Scraper
Search Hacker News using the free [Algolia HN Search API](https://hn.algolia.com/api). No Apify token or API key needed.
## Quick Start
Only dependency: `pip install requests`.
```bash
# Stories about AI content marketing in last week
python3 skills/hacker-news-scraper/scripts/search_hn.py \
--query "AI content marketing" --days 7
# Show HN posts in last month (summary view)View the complete source on GitHubjob-posting-intent
When your agent uses it
Detect buying intent from job postings. When a company posts a job in your problem area, they've allocated budget and are actively thinking about the problem. This skill finds those companies, qualifies them, extracts personalization context, and outputs everything to a Google Sheet. Does NOT do outreach — just delivers qualified leads with reasoning.
What it loads into context
Frontmatter
88 tokensAlways available to the agent
SKILL.md
2,114 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Why This Works
- Cost
- Setup
- Usage
- What the Script Does
- Options Reference
- Google Sheet Columns
- AI Agent Integration
- Outreach Angle Templates
- Troubleshooting
- Links
Scripts executed separately
scripts/create_sheet.pyscripts/create_sheet_mcp.pyscripts/search_jobs.py
Files
SKILL.mdcore8,816 bytesSKILL.mdcore8,816 bytesSKILL.mdcore8,816 bytesSKILL.mdcore8,816 bytesSKILL.mdcore8,816 bytesscripts/create_sheet.pyruns3,765 bytesscripts/create_sheet_mcp.pyruns6,221 bytesscripts/search_jobs.pyruns27,319 bytesskill.meta.jsonasset173 bytes
Read SKILL.md
# Job Posting Intent Detection
Find companies that are hiring for roles related to the problem you solve. A job posting is a **budget signal** — the company has allocated money to solve a problem your product addresses.
Results are automatically exported to a **Google Sheet** with signal strength, decision-maker suggestions, outreach angles, and personalization context.
## Why This Works
When a company posts a job, they've:
- Allocated budget (headcount is expensive)
- Acknowledged the problem exists
- Started actively solving it
If your product helps solve that problem faster, cheaper, or better than a hire alone, the timing is perfect.View the complete source on GitHublaunch-meta-ad-campaign
When your agent uses it
Take someone from a business goal to a verified, paused-then-live Meta/Facebook/Instagram campaign without making them learn Meta's hierarchy. Use automatically for requests to launch, run, create, publish, set up, or plan Meta ads; use reporting skills for analysis-only requests.
What it loads into context
Frontmatter
67 tokensAlways available to the agent
SKILL.md
5,122 tokensWhen the skill is activated
Reference documents
2,594 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choose one mode
- How to talk to the user
- Workflow
- Where the two confirmations happen
- Partial failures
- Final response
Scripts executed separately
tools/meta_marketing_api.js
Files
SKILL.mdcore22,764 bytesSKILL.mdcore22,764 bytesagents/openai.yamlasset255 bytesreferences/direct-meta-adapter.mddoc4,461 bytesreferences/gooseworks-adapter.mddoc4,230 bytesreferences/planning-only.mddoc2,804 bytesskill.meta.jsonasset961 bytestools/meta_marketing_api.jsruns39,093 bytes
Read SKILL.md
# Launch Meta Ad Campaign
**What this is for.** Someone says "I want more signups". They should not have to learn what a
campaign objective is, what an ad set does, what a pixel is, or which of Meta's fourteen
optimization goals fits — and they should not be asked to choose any of them. They tell you
about their business; you do the rest and explain it back in their words.
The skill is agent-neutral: choose the best available adapter, but keep one journey and one
approval boundary.
## Choose one mode
Use the first available mode:
View the complete source on GitHublead-qualification
When your agent uses it
Lead qualification engine with conversational intake. Asks structured questions to understand your qualification criteria, generates a reusable qualification prompt, then batch-enriches leads via Apify LinkedIn scraping and scores them with parallel processing. Outputs qualified/disqualified verdicts with confidence scores and reasoning to CSV or whatever output format the user prefers. Supports calibration mode for prompt refinement.
What it loads into context
Frontmatter
87 tokensAlways available to the agent
SKILL.md
3,930 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Three Modes of Operation
- Phase 1: Intake (Mode 1 Only)
- Phase 2: Lead Qualification
- Tools Required
- Example Usage
Scripts executed separately
scripts/enrich_leads.py
Files
SKILL.mdcore16,962 bytesSKILL.mdcore16,962 bytesscripts/enrich_leads.pyruns19,897 bytesskill.meta.jsonasset157 bytes
Read SKILL.md
# Lead Qualification Engine
Qualify leads against custom criteria through a structured intake process, then score lead lists in parallel with confidence ratings and reasoning.
## Three Modes of Operation
### Mode 1: Full Intake + Qualify
No existing qualification prompt. Run intake to build one, save it, then qualify leads.
**Trigger:** User provides no qualification prompt.
### Mode 2: Reuse Prompt + Qualify
User supplies an existing qualification prompt — skip intake, go straight to scoring.
View the complete source on GitHublinkedin-profile-post-scraper
When your agent uses it
Scrape recent posts from LinkedIn profiles using Apify. Use when you need to monitor what specific people are posting on LinkedIn, track founder/exec activity, or gather LinkedIn content for competitive intelligence.
What it loads into context
Frontmatter
58 tokensAlways available to the agent
SKILL.md
500 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Start
- CLI Reference
- Cost
- Notes
Scripts executed separately
scripts/scrape_linkedin_posts.py
Files
SKILL.mdcore1,982 bytesSKILL.mdcore1,982 bytesSKILL.mdcore1,982 bytesSKILL.mdcore1,982 bytesSKILL.mdcore1,982 bytesscripts/scrape_linkedin_posts.pyruns9,531 bytesskill.meta.jsonasset152 bytes
Read SKILL.md
# LinkedIn Profile Post Scraper
Scrape recent posts from specific LinkedIn profiles using the Apify `harvestapi/linkedin-profile-posts` actor.
## Quick Start
Requires `APIFY_API_TOKEN` env var (or `--token` flag). Install dependency: `pip install requests`.
```bash
# Scrape recent posts from a profile
python3 skills/linkedin-profile-post-scraper/scripts/scrape_linkedin_posts.py \
--profiles "https://www.linkedin.com/in/example-person" --max-posts 10
# Multiple profiles with keyword filteringView the complete source on GitHubmeta-ad-manager
When your agent uses it
Front door and loop owner of a Meta (Facebook/Instagram) ad harness. Reads the brand's ads/ docs, works out which campaign the user means and which stage it is at, hands off to the stage skill that runs it (intake, strategy, creative, launch, checks, fixes, answers), and writes every stage change back to the docs. Use it when someone wants to run ads on Meta, comes back to ads they started earlier, a stage skill hands back, or a scheduled check fires.
What it loads into context
Frontmatter
112 tokensAlways available to the agent
SKILL.md
5,267 tokensWhen the skill is activated
Reference documents
8,000 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Where this skill's files are
- Choose one mode
- Stage skills
- Inputs
- Workflow
- How to talk to the user
- Decision Rules
- Output
- Quality Checks
- Failure Modes
Scripts executed separately
contract/tests/test_validate.pycontract/validate.py
Files
SKILL.mdcore21,783 bytesSKILL.mdcore21,783 bytesagents/openai.yamlasset258 bytescontract/README.mddoc1,654 bytescontract/RULES.mddoc4,624 bytescontract/examples/sample-brand/ads/README.mddoc504 bytescontract/examples/sample-brand/ads/brand.mddoc1,564 bytescontract/examples/sample-brand/ads/campaigns/fall-subscription-launch/decisions.mddoc784 bytescontract/examples/sample-brand/ads/campaigns/fall-subscription-launch/state.mddoc517 bytescontract/examples/sample-brand/ads/campaigns/fall-subscription-launch/strategy.mddoc1,311 bytescontract/examples/sample-brand/ads/campaigns/holiday-gift-bundles/decisions.mddoc319 bytescontract/examples/sample-brand/ads/campaigns/holiday-gift-bundles/state.mddoc444 bytescontract/examples/sample-brand/ads/campaigns/holiday-gift-bundles/strategy.mddoc1,041 bytescontract/templates/README.mddoc1,419 bytescontract/templates/brand.mddoc2,167 bytescontract/templates/campaign/decisions.mddoc940 bytescontract/templates/campaign/state.mddoc1,706 bytescontract/templates/campaign/strategy.mddoc1,801 bytescontract/tests/test_validate.pyruns11,796 bytescontract/validate.pyruns18,617 bytesreferences/direct-meta-adapter.mddoc3,131 bytesreferences/gooseworks-adapter.mddoc6,194 bytesreferences/planning-only.mddoc1,685 bytesskill.meta.jsonasset894 bytes
Read SKILL.md
# Meta Ad Manager
**What this is for.** Someone says "I want to run ads on Meta", or comes back a week later and
says "where are we?", or a scheduled check wakes up. This skill works out where things stand
from the brand's ad docs, picks the next step, hands it to the skill that does that step, and
writes down what happened and why. It never makes the user repeat themselves.
**It does not do the stage work itself.** Intake, strategy, making creatives, launching,
checking and fixing each belong to their own skill. This skill decides which one runs, sets the
tone, and keeps the docs true.
**The docs contract is law.** How to read and write the files and the rules for numbers are in
[contract/RULES.md](contract/RULES.md). The file shapes are in
[contract/templates/](contract/templates/), and [contract/validate.py](contract/validate.py)View the complete source on GitHubmeta-ad-policy-checker
When your agent uses it
Pre-flight policy check for Meta ads. Takes ad copy plus advertiser context, resolves and fetches the relevant Meta transparency-center policy pages at runtime, and returns a Pass / Fix Required / Block verdict with cited findings and rewrites.
What it loads into context
Frontmatter
56 tokensAlways available to the agent
SKILL.md
2,794 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Phase 0: Intake
- Phase 1: Determine Which Policies Apply
- Phase 2: Fetch + Cache Live Policy Text
- Phase 3: Reason — Ad vs. Policy
- Phase 4: Landing-Page Cross-Check *(if URL provided)*
- Phase 5: Produce the Output
- Phase 6: Integration Hooks
- Output Standards (Mandatory)
- What This Skill Will Not Do
- Maintenance Note
- Related Skills
Files
SKILL.mdcore12,517 bytesSKILL.mdcore12,517 bytesskill.meta.jsonasset151 bytes
Read SKILL.md
# Meta Ad Policy Checker
Meta disapproves ads for policy reasons constantly, and most disapprovals are preventable. The pattern is almost always the same: an advertiser (or an AI agent generating variants) writes copy that uses a phrase or implies a claim that violates Meta's published advertising standards. The fix is cheap if you catch it before submission, expensive if you don't — repeated disapprovals on the same account can throttle delivery or trigger account-level restrictions.
This skill is a pre-flight check. It reads ad copy, figures out which Meta policies apply, fetches the live policy text from Meta's transparency center, and returns a clear verdict with specific findings, citations, and rewrites. It does not hardcode policy rules — Meta updates those, and a static rule list goes stale. Instead, the skill uses Meta's own canonical policy pages as ground truth on every run.
**Core principle:** The skill provides the methodology — what to check, how to reason, what severity to assign. Meta provides the source of truth — the actual policy text. This separation is what keeps the skill correct as Meta's standards evolve.
## When to Use
- Before launching any new Meta ad
- After generating ad copy variants (call this on each variant before showing or submitting)
- When auditing an existing live ad for policy risk
- When troubleshooting a recently disapproved adView the complete source on GitHubmeta-ads-analyzer
When your agent uses it
Diagnose Meta Ads campaign performance and account gaps using Meta's actual system mechanics — including customer-journey coverage, Breakdown Effect, Learning Phase, Auction Overlap, Pacing, and Creative Fatigue. Use for performance diagnosis, account audits, full-funnel or TOF/MOF/BOF gap analysis, deciding what to test or create next, and producing novice-friendly recommendations without forcing every campaign or ad into a funnel stage.
What it loads into context
Frontmatter
96 tokensAlways available to the agent
SKILL.md
4,114 tokensWhen the skill is activated
Reference documents
963 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Phase 0: Intake
- Phase 1: Identify the Correct Evaluation Level
- Phase 2: Check Learning Phase Status
- Phase 3: Diagnose with Meta-Specific Lenses
- Phase 4: Synthesize Through the Breakdown Effect Lens
- Phase 5: Generate the Report
- Output Standards (Mandatory)
- Metric Naming Standard
- Reference: Domain Concepts
- What This Skill Will Not Do
- Related Skills
- Credit
Files
SKILL.mdcore18,730 bytesSKILL.mdcore18,730 bytesSKILL.mdcore18,730 bytesreferences/customer-journey-coverage.mddoc4,745 bytesskill.meta.jsonasset146 bytes
Read SKILL.md
# Meta Ads Analyzer
Most "Meta Ads analysis" stops at "this CPA is high, pause it." That's wrong more often than it's right. Meta's delivery system optimizes for **marginal efficiency** — the cost of the *next* conversion — not average efficiency across a snapshot. A segment with a higher average CPA is often the one keeping your overall campaign cheap. Pausing it makes things worse.
This skill diagnoses Meta campaigns the way a senior media buyer would: at the right evaluation level, accounting for learning state, separating noise from signal, and explaining *why* the system is making the decisions it's making before recommending any change. It can also audit whether the account supports the complete customer journey without assuming that TOF, MOF, and BOF must be separate campaigns.
**Core principle:** Holistic first, then drill down. Marginal over average. Customer-journey coverage over rigid funnel structure. Dynamic over static. Every recommendation is a testable hypothesis with expected impact, not a directive.
For account audits, full-funnel reviews, or questions about what is missing, read and apply [references/customer-journey-coverage.md](references/customer-journey-coverage.md) before analyzing the account.
## When to Use
- "Analyze my Meta Ads campaign performance"
- "Why is the system spending more on the higher-CPA placement?"View the complete source on GitHubreddit-post-finder
When your agent uses it
Scrape and search Reddit posts using Apify. Use when you need to find Reddit discussions, track competitor mentions, monitor product feedback, discover pain points, or analyze subreddit content. Supports keyword filtering, time-based searches, and subreddit-specific queries.
What it loads into context
Frontmatter
58 tokensAlways available to the agent
SKILL.md
1,343 tokensWhen the skill is activated
Reference documents
965 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Start
- How the Script Works
- CLI Reference
- Tips for Small Subreddits
- Direct API Usage
- Common Workflows
- Important: Always Include Post URLs
- Output Format
- Configuration
Scripts executed separately
scripts/search_reddit.py
Files
SKILL.mdcore4,893 bytesSKILL.mdcore4,893 bytesSKILL.mdcore4,893 bytesSKILL.mdcore4,893 bytesSKILL.mdcore4,893 bytesSKILL.mdcore4,893 bytesSKILL.mdcore4,893 bytesSKILL.mdcore4,893 bytesSKILL.mdcore4,893 bytesreferences/apify-config.mddoc3,249 bytesscripts/search_reddit.pyruns9,364 bytesskill.meta.jsonasset147 bytes
Read SKILL.md
# Reddit Post Finder
Scrape Reddit posts and comments using the Apify `trudax/reddit-scraper-lite` actor.
## Quick Start
Requires `APIFY_API_TOKEN` env var (or `--token` flag).
```bash
# Top posts from r/growthhacking in last week
python3 skills/reddit-post-finder/scripts/search_reddit.py \
--subreddit growthhacking --days 7 --sort top --time week
# Hot posts from multiple subredditsView the complete source on GitHubremix-graphic-ad-from-reference
When your agent uses it
Recreate a static graphic ad (Pinterest pin, IG/FB feed image, poster) from a reference image, swapping in a new brand's product and new copy while keeping the reference's layout, composition, and visual energy. ALWAYS generated with GPT Image 2 in edit-the-reference mode (fal-ai/gpt-image-1/edit-image, a billed FAL generation); the HTML/goose-graphics overlay is only an optional text-finishing step, never the generator. The static-graphics counterpart to the video remix-ad skill; this is what the app calls when a user picks a reference ad and wants it for their own product.
What it loads into context
Frontmatter
139 tokensAlways available to the agent
SKILL.md
4,824 tokensWhen the skill is activated
Reference documents
1,351 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Purpose
- Inputs
- Brand grounding — read the kit, never improvise (do this before generating)
- Composed Atoms
- Workflow
- Decision Rules
- Output
- Quality Checks
- Failure Modes
- Spend Reference
- Tests
- Skill Location & Related
Scripts executed separately
scripts/cutout_product.py
Files
SKILL.mdcore19,324 bytesSKILL.mdcore19,324 bytesSKILL.mdcore19,324 bytesSKILL.mdcore19,324 bytesSKILL.mdcore19,324 bytesassets/overlay-template.htmlasset4,872 bytesrequirements.txtdoc119 bytesscripts/cutout_product.pyruns2,737 bytesskill.meta.jsonasset445 bytestests/expected-output.mddoc1,020 bytestests/human-test.mddoc897 bytestests/sample-input.mddoc1,019 bytestests/smoke-test.mddoc1,052 bytestests/verifier.mddoc1,096 bytes
Read SKILL.md
# remix-graphic-ad-from-reference
## Purpose
Given **one reference ad image** + a **target product** + **new copy**, produce a finished static ad
that keeps the reference's *layout and composition* but swaps the product and words for the new brand.
This powers the app's "pick a Pinterest ad you like → get the same ad for your product" flow.
It does **not** invent layouts and it does **not** regenerate the whole scene from scratch. It reads
the reference, then recreates it with GPT Image 2:
- **GPT Image 2 (edit the reference) — ALWAYS use this as the generator.** Run it in **image-edit
mode on the reference itself** to preserve the layout/composition and swap in the new product +
copy. This is the engine for EVERY remix (premium look). FAL slug `fal-ai/gpt-image-1/edit-image`.View the complete source on GitHubscrapecreators-api
When your agent uses it
Provider reference for collecting public profiles, posts, comments, transcripts, trends, and ad-library data from major social platforms through ScrapeCreators. Use as a dependency of research workflows, not as the final user-facing deliverable.
What it loads into context
Frontmatter
54 tokensAlways available to the agent
SKILL.md
1,239 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Runtime selection
- Endpoint families
- Collection rules
- Output contract
Files
SKILL.mdcore5,388 bytesSKILL.mdcore5,388 bytesSKILL.mdcore5,388 bytesSKILL.mdcore5,388 bytesskill.meta.jsonasset161 bytes
Read SKILL.md
# ScrapeCreators API
Use ScrapeCreators when a workflow needs structured public social or ad-library data at a scale that ordinary web search cannot provide.
## Runtime selection
Task skills describe each request as an environment-neutral operation containing `provider`, `method`, `path`, and optional `query` or `body`. Execute that same operation through the first available runtime:
1. **GooseWorks MCP available:** inspect and call the live `data_call_provider` tool. Pass the operation fields directly. This is the preferred path in ChatGPT, Cowork, and any client without a terminal. It uses the first-party GooseWorks ScrapeCreators proxy and managed key; it does not route through Orthogonal.
2. **Local GooseWorks CLI available:** translate the operation into `gooseworks call <provider> <path>`, adding the method, query, or body options represented in the operation. The CLI uses the same first-party proxy.
3. **User-owned ScrapeCreators key available:** call `https://api.scrapecreators.com<path>` with `SCRAPECREATORS_API_KEY` in the `x-api-key` header, using the operation's method, query, and JSON body.
4. **No runtime available:** ask the user to connect GooseWorks MCP, sign in through the local GooseWorks CLI, or provide their own ScrapeCreators key. Do not pretend the operation ran.
Prefer MCP whenever `data_call_provider` is registered, even if a shell might also exist. Never ask for a separate provider key when the managed MCP or CLI path is available. Never print, store, or return either credential.View the complete source on GitHubtranscript-intelligence
When your agent uses it
Turn TikTok, Instagram, YouTube, Facebook, X, LinkedIn, Reddit, or Rumble transcripts into timestamped hooks, claims, objections, proof, calls to action, sponsorship signals, and reusable content atoms. Use directly for transcript analysis or as support for creator, competitor, trend, demand, and repurposing work.
What it loads into context
Frontmatter
76 tokensAlways available to the agent
SKILL.md
411 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Inputs
- Workflow
- Output
- Guardrails
Files
SKILL.mdcore2,000 bytesSKILL.mdcore2,000 bytesskill.meta.jsonasset366 bytes
Read SKILL.md
# Transcript Intelligence
Analyze what a video says, not just its caption or engagement count.
## Inputs
- One or more TikTok, Instagram, YouTube, Facebook, X, LinkedIn, Reddit, or Rumble post or video URLs.
- The brand, product, or research question.
- Optional comparison dimensions such as hooks, objections, proof, or creator delivery.
## Workflow
1. Fetch the post metadata with `scrapecreators-api`.
2. Fetch the platform transcript when available. For YouTube, collect public sponsorship signals when relevant. If a transcript is unavailable, explicitly mark the item as caption-only; never invent spoken content.View the complete source on GitHubanimate-image
When your agent uses it
Animate an existing product image or static ad into a short branded video using the GooseWorks Animate Images workflow, with source-image continuity and optional end-frame control.
What it loads into context
Frontmatter
38 tokensAlways available to the agent
SKILL.md
1,101 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisite
- Tool calls
- Workflow
- Rules
Files
SKILL.mdcore4,638 bytesSKILL.mdcore4,638 bytesSKILL.mdcore4,638 bytesskill.meta.jsonasset155 bytes
Read SKILL.md
# Animate Image
Turn an existing product image or static ad into a short motion creative through GooseWorks. This skill uses the same backend workflow as the Animate Images interface.
## Prerequisite
This workflow requires the GooseWorks MCP connector (`https://mcp.gooseworks.ai/mcp`). It uses three tools: `ads_creative_animation_quote` (free price), `ads_creative_animate` (paid start) and `job_get` (poll). Some clients list tools by group and show the `ads` tools only after they are loaded. If `ads_creative_animation_quote` or `ads_creative_animate` is not in the advertised tool list, call `tools_load` with `{ "groups": ["ads"] }` first (free). If the tools are still missing, or `account_whoami` reports `features.animate_image: false`, explain that the connection or feature is not available and stop; do not substitute an unrelated image generator.
## Tool calls
| Step | Call | Notes |
|---|---|---|
| Quote | `ads_creative_animation_quote` | Free and read-only. Fetches nothing and reserves nothing. Returns `{ dry_run: true, estimate: { frame, duration_seconds, model, estimated_credits } }`. |
| Start | `ads_creative_animate` | Paid. Reserves credits and starts the job. Returns `{ job_id, kind: "animate", status }`. |View the complete source on GitHubcaption-burn
When your agent uses it
Burned-in captions for a finished vertical video, three kinds. transcribe.py gets word timings from the video's own audio through the GooseWorks proxy (fal Whisper, charged to your GooseWorks credits, cents); captions.py burns one to three words at a time with Pillow + ffmpeg (no libass needed), either pinned to a split-screen seam (plate 25% above / 75% below) or at a fixed height, in a plate, outline or one-word serif style, with an optional red hook card; plates.py burns per-beat caption blocks (black, one union silhouette, placed in the emptiest band) for formats with no voice. The last caption (the CTA) holds to the final frame. Use as the last step of any video ad.
What it loads into context
Frontmatter
183 tokensAlways available to the agent
SKILL.md
1,169 tokensWhen the skill is activated
Reference documents
155 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Placement and style
- Captions for a format with no voice (plates.py)
- Rules
- Footprint before composition
Scripts executed separately
scripts/_fonts.pyscripts/captions.pyscripts/footprint.pyscripts/media_proxy.pyscripts/plates.pyscripts/transcribe.py
Files
SKILL.mdcore4,805 bytesSKILL.mdcore4,805 bytesSKILL.mdcore4,805 bytesSKILL.mdcore4,805 bytesscripts/_fonts.pyruns3,120 bytesscripts/captions.pyruns12,920 bytesscripts/footprint.pyruns2,708 bytesscripts/media_proxy.pyruns58,192 bytesscripts/plates.pyruns7,679 bytesscripts/transcribe.pyruns1,937 bytesskill.meta.jsonasset243 bytestests/smoke-test.mddoc634 bytes
Read SKILL.md
> **Superseded:** the video kit now does this with the captions-layer part, version 1.1.0, in the parts folder of this repository. It burns the same plate captions from the speech timings, holds the last caption to the end, transcribes only when there are no timings, and returns a WebVTT of what it drew. This atom stays, unchanged in behaviour, for skills outside the kit until they move; its scripts still run.
# caption-burn
Captions timed to what is actually said in the finished video, not to the script's
estimate.
## Run
```bash
python transcribe.py --media reel.mp4 --out reel.words.json # paid, cents
python captions.py --video reel.mp4 --beats cutlist.aligned.json \
--words reel.words.json --out final.mp4 [--style plate|outline] [--highlight Brand]
```View the complete source on GitHubcompose-creator-layer
When your agent uses it
Composite a generated creator track into a product layer, per beat — in the creator's zone on split beats (either side of a seam), full frame on creator beats, hidden on product beats — with the creator's voice as the audio (loudness -14 LUFS) and an optional ducked music bed, or a music-only or silent master for voiceless formats. Free, local ffmpeg. Pairs with footage-cutlist (the layer) and create-creator-takes-h3 (the creator). Use for split-screen (with an optional zoom and brand-colour seam bar), screen-insert and any creator-over-product format.
What it loads into context
Frontmatter
143 tokensAlways available to the agent
SKILL.md
877 tokensWhen the skill is activated
Reference documents
98 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Split screen
- Rules
Scripts executed separately
scripts/compose.pytests/test_compose_split.py
Files
SKILL.mdcore3,229 bytesSKILL.mdcore3,229 bytesscripts/compose.pyruns7,418 bytesskill.meta.jsonasset206 bytestests/smoke-test.mddoc383 bytestests/test_compose_split.pyruns3,000 bytes
Read SKILL.md
# compose-creator-layer
## Run
```bash
python compose.py --layer layer.mp4 --beats cutlist.aligned.json --creator creator.mp4 \
--out reel.mp4 [--music bed.mp3 --music-db -20] [--head 0.30] \
[--zoom 1.15] [--divider '#RRGGBB' --divider-px 4]
```
- `--layer`: `footage-cutlist` `cut.py` output rendered from the **same** cut list as
`--beats` (re-render it after `align_beats.py`). `--draft` layers are refused.
- `--creator`: `create-creator-takes-h3` `join_takes.py` output, reel time from 0.
- `--audio creator|music|none`: the voice (+ ducked `--music`), the `--music` bed aloneView the complete source on GitHubcreate-apple-notes-mockup
When your agent uses it
Render pixel-accurate Apple Notes (iPhone, light mode) screenshot mockups from a JSON note spec. Outputs HTML + PNG at the iPhone 16/15 Pro native 1180×2556. Supports paragraphs, images, checklists, dividers, autocorrect underline, smart quotes, and an optional iOS keyboard chrome overlay used by the parent video-ad molecule.
What it loads into context
Frontmatter
109 tokensAlways available to the agent
SKILL.md
2,606 tokensWhen the skill is activated
Reference documents
969 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Purpose
- When to use
- Inputs
- CLI
- Output
- Workflow
- Setup (one-time)
- Files
- Quality Checks
- Failure Modes
- Reference
Scripts executed separately
generate.jspackage.jsonrender.jsscreenshot.jstemplates/icons.jstests/run-all.sh
Files
SKILL.mdcore10,286 bytesSKILL.mdcore10,286 bytesSKILL.mdcore10,286 bytesexamples/frame-1-title-only.jsonasset457 bytesexamples/long.jsonasset867 bytesexamples/mid.jsonasset649 bytesexamples/short.jsonasset458 bytesexamples/with-checklist.jsonasset889 bytesexamples/with-image.jsonasset581 bytesgenerate.jsruns7,967 bytespackage.jsonruns376 bytesrender.jsruns3,858 bytesscreenshot.jsruns1,822 bytesskill.meta.jsonasset140 bytestemplates/icons.jsruns6,557 bytestemplates/note.cssasset8,563 bytestests/expected-output.mddoc1,260 bytestests/human-test.mddoc848 bytestests/run-all.shruns393 bytestests/sample-input.mddoc1,089 bytestests/smoke-test.mddoc474 bytes
Read SKILL.md
> **Superseded:** the video kit now does this with the phone-chat part, version 1.2.0, in the parts folder of this repository. Every phone-chat style is a style file that draws the same screen frame by frame from the plan's scenes, with the original sounds, in the kit's browser. This atom stays, unchanged in behaviour, for skills outside the kit until they move; its scripts still run.
# create-apple-notes-mockup
Generate Apple Notes screens that look like real iPhone screenshots — correct status bar, floating toolbar pill, bold title, body text with paragraph spacing, yellow text cursor, autocorrect underline, optional embedded images and checklists, and an optional iOS keyboard.
## Purpose
Turn a JSON note spec into a pixel-accurate Apple Notes (iPhone, light mode) screenshot — HTML + PNG at the native 1180×2556 (DPR 2). It is the deterministic, no-LLM renderer that an Apple Notes video ad drives frame-by-frame to fake a typing animation, and a standalone tool for one-off "noted to self" beats in ads, social posts, and storyboards. The orchestrating agent owns the copy; this atom owns the fidelity (status bar, smart punctuation, cursor, autocorrect underline, toolbar, keyboard chrome).
## When to use
- Need a fake Apple Notes screenshot for an ad, social post, video scene, or product mockup.
- Need a sequence of Apple Notes frames (title-only → adding paragraphs → cursor moves) to drive a typing-animation video ad.View the complete source on GitHubcreate-chatgpt-mockup
When your agent uses it
Render pixel-accurate ChatGPT mobile (iOS) screen mockups in light mode from a thread JSON. Supports user text bubbles, user image attachments, assistant markdown prose, citation chips, the OpenAI spiral logo, the Apps-SDK GPT chip in the composer, and three header styles (model-tag, plain title, "Get Plus"). Fixed 9:16 viewport. Outputs HTML + PNG.
What it loads into context
Frontmatter
112 tokensAlways available to the agent
SKILL.md
4,008 tokensWhen the skill is activated
Reference documents
1,934 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Purpose
- Inputs
- CLI
- Output
- Workflow
- Setup (one-time)
- Quality checks
- Failure modes
- Files
- Known limitations
- Quality Checks
- Failure Modes
Scripts executed separately
generate.jspackage.jsonrender.jsscreenshot.jstemplates/icons.jstests/run-all.sh
Files
SKILL.mdcore15,235 bytesSKILL.mdcore15,235 bytesSKILL.mdcore15,235 bytesSKILL.mdcore15,235 bytesexamples/01-sunscreen-image.jsonasset467 bytesexamples/02-sleep-apnea-long.jsonasset1,160 bytesexamples/03-poem-iphone-mac.jsonasset1,007 bytesexamples/04-empty-typing.jsonasset258 bytesexamples/05-seatfinch-gpt-chip.jsonasset596 bytesexamples/06-short-howto.jsonasset750 bytesexamples/assets/sunscreen-sky.svgasset3,207 bytesgenerate.jsruns16,686 bytespackage.jsonruns348 bytesrender.jsruns3,023 bytesscreenshot.jsruns2,608 bytesskill.meta.jsonasset136 bytestemplates/chat.cssasset16,985 bytestemplates/icons.jsruns11,820 bytestests/expected-output.mddoc2,857 bytestests/human-test.mddoc1,886 bytestests/run-all.shruns414 bytestests/sample-input.mddoc1,812 bytestests/smoke-test.mddoc796 bytes
Read SKILL.md
> **Superseded:** the video kit now does this with the phone-chat part, version 1.2.0, in the parts folder of this repository. Every phone-chat style is a style file that draws the same screen frame by frame from the plan's scenes, with the original sounds, in the kit's browser. This atom stays, unchanged in behaviour, for skills outside the kit until they move; its scripts still run.
# create-chatgpt-mockup
## Purpose
Generate single-frame ChatGPT mobile screens that read as real iOS captures — accurate header chrome, user/assistant message styling, composer pill, status bar, and the OpenAI spiral mark. Designed for use inside ad creatives, social posts, video storyboards, and product mockups.
If you need an **animated, video-recorded chat reveal** (bubbles popping over time, SFX, music bed, end card), use the `render-chatgpt-chat` skill. This atom only produces a single still frame.
## Inputs
Compose a `thread.json` matching the schema below, then pass it to `render.js`.
View the complete source on GitHubcreate-creator-takes-h3
When your agent uses it
Generate an AI creator talking to camera, saying an approved script, as one continuous track — H3 Max reference-to-video through the GooseWorks fal-proxy (charged to your GooseWorks credits). Plans takes on line boundaries under H3's 15s cap, dry-runs a cost estimate, generates the first take alone so its voice can be locked and passed to every later take, joins takes with measured 0.10s dissolves, and moves each line's timing onto the words actually spoken. Use for any format with a generated creator speaking a script (split-screen, screen inserts, talking-head ads).
What it loads into context
Frontmatter
164 tokensAlways available to the agent
SKILL.md
7,714 tokensWhen the skill is activated
Reference documents
332 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quality tier: Standard or Best
- Run
- Action shots, skin condition and light (2.5.0)
- Both hands, voice and pace (2.4.0)
- Measured take reviews and a voice across heritage (2.9.0)
- Realism check and a voice for every person (2.8.0)
- Voice by ethnicity, chosen with the person (2.6.0)
- Choices
- Rules
- Failure modes
- Free planning before the still exists
- Measured join acceptance
- Rejection, physical constraints and cast planning
- Source review and timing contract
Scripts executed separately
scripts/align_beats.pyscripts/content_review.pyscripts/join_takes.pyscripts/make_character.pyscripts/media_proxy.pyscripts/pair_voice.pyscripts/plan_takes.pyscripts/run_takes.pyscripts/tiers.pytests/test_action_skin_light.pytests/test_hands_voice_pace.pytests/test_make_character.pytests/test_quality_tier.pytests/test_run_takes_rejection.pytests/test_voice_ethnicity.py
Files
SKILL.mdcore32,398 bytesSKILL.mdcore32,398 bytesSKILL.mdcore32,398 bytesSKILL.mdcore32,398 bytesSKILL.mdcore32,398 bytesSKILL.mdcore32,398 bytesSKILL.mdcore32,398 bytesSKILL.mdcore32,398 bytesSKILL.mdcore32,398 bytesSKILL.mdcore32,398 bytesSKILL.mdcore32,398 bytesSKILL.mdcore32,398 bytesscripts/align_beats.pyruns4,002 bytesscripts/character-prompt.jsonasset2,110 bytesscripts/content_review.pyruns3,391 bytesscripts/join_takes.pyruns13,101 bytesscripts/make_character.pyruns30,759 bytesscripts/media_proxy.pyruns58,192 bytesscripts/pair_voice.pyruns38,987 bytesscripts/plan_takes.pyruns21,228 bytesscripts/run_takes.pyruns19,472 bytesscripts/tiers.pyruns6,236 bytesskill.meta.jsonasset278 bytestests/smoke-test.mddoc1,281 bytestests/test_action_skin_light.pyruns7,131 bytestests/test_hands_voice_pace.pyruns10,345 bytestests/test_make_character.pyruns5,048 bytestests/test_quality_tier.pyruns13,869 bytestests/test_run_takes_rejection.pyruns17,249 bytestests/test_voice_ethnicity.pyruns35,373 bytes
Read SKILL.md
> **Superseded by:** `creator-h3@1.8.0`. Compatibility scripts retain the source-review guards; frozen versions are unchanged.
# create-creator-takes-h3
**Summary.** Generate one creator take, review the actual picture and sound, then continue with qualified sources. Keep native speech attached to its picture and assemble only complete reviewed takes. The provider can still invent words, drift in identity or fail an action; prompts and transcripts do not certify a pass.
Use the shared builder for people. Defaults: GPT Image 2, phone capture in a lived-in room, deep focus, no bokeh, no retouching, and one light lock (window or lamp light from one side, normal exposure, no HDR, matte skin, no over-sharpening). Studio or shallow focus only when the reference is shot that way. No forced flaws; marks only when the user chose them, and a skin condition only when the product treats it. A person who acts is an action shot, not a talking head.
| Script | What | Cost |
|---|---|---|
| `make_character.py` | build the creator still from the user's choices, one shot | **paid** (one still, cents) |
| `pair_voice.py` | the voice for this person: a matched ElevenLabs voice, or a Voice Design request | free (Voice Design itself is paid) |
| `plan_takes.py` | split lines into takes (under 15s each) and write the prompts | free |
| `run_takes.py` | generate the takes, dry run unless `--go` | **paid** (H3 Max, 768P by default) |View the complete source on GitHubcreate-image-fal
When your agent uses it
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...), routed through the GooseWorks proxy, so the call is charged to your GooseWorks credits. image_urls must be public URLs; --image puts a local file on the fal CDN first. The recipe names the model + prompt. Use for keyframes, flat-cover transforms, product hero edits. (For the OpenAI gpt-image family specifically, create-image-gpt-image-fal also exists.)
What it loads into context
Frontmatter
116 tokensAlways available to the agent
SKILL.md
2,035 tokensWhen the skill is activated
Reference documents
1,931 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- The brand's own product
- Contract
- Edit an image (Nano Banana edit)
- Creator references
- Model notes
Scripts executed separately
scripts/brand_pack_lint.pyscripts/gen_image.pyscripts/image_quality.pyscripts/media_proxy.pytests/test_brand_pack_lint.pytests/test_image_quality.py
Files
SKILL.mdcore8,227 bytesSKILL.mdcore8,227 bytesSKILL.mdcore8,227 bytesSKILL.mdcore8,227 bytesreferences/avatar-generation.mddoc9,260 bytesscripts/brand_pack_lint.pyruns4,545 bytesscripts/gen_image.pyruns6,779 bytesscripts/image_quality.pyruns1,529 bytesscripts/media_proxy.pyruns58,192 bytesskill.meta.jsonasset177 bytestests/smoke-test.mddoc280 bytestests/test_brand_pack_lint.pyruns4,907 bytestests/test_image_quality.pyruns1,206 bytes
Read SKILL.md
# create-image-fal
**GPT Image 2 quality follows the customer's tier.** `gen_image.py` always sends an explicit quality: `--tier standard` (the default) is `medium`, `--tier best` is `high`; a payload's own `quality`, or `--quality`, wins. Above the tier is a one-shot upgrade, only after a failed check at the cheaper setting or when the customer asks (see create-creator-takes-h3's quality tier). `--query '{"shot_scene": 3, "upgrade_reason": ...}'` sends the call's GooseWorks query fields.
**Never hand-write a person prompt.** Any image with a person in it is made by create-creator-takes-h3's `scripts/make_character.py` (GPT Image 2, phone capture, deep focus, no retouching), unless the recipe prescribes its own creator still; read [the avatar-generation guide](references/avatar-generation.md) first. Nano Banana is for cartoons only, never for real people or real products, and never use Flux for a face.
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...), routed through the GooseWorks proxy, so the call is charged to your GooseWorks credits. image_urls must be public URLs; --image puts a local file on the fal CDN first. The recipe names the model + prompt. Use for keyframes, flat-cover transforms, product hero edits. (For the OpenAI gpt-image family specifically, create-image-gpt-image-fal also exists.)
## Run
gen_image.py --model fal-ai/nano-banana/edit --payload '{...}' --out keyframe.png — charged to your GooseWorks credits; returns the *.fal.media URL.
## The brand's own product
**Never ask for a blank pack of the advertised product.** "No brand text in a prompt" bans *typing*View the complete source on GitHubcreate-image-gpt-image-fal
When your agent uses it
Generate a single photoreal or designed image with OpenAI gpt-image via fal.ai. Supports gpt-image-1 (default, fixed sizes — the FAL fallback for Higgsfield's `gpt_image_2`) and gpt-image-2 (`openai/gpt-image-2`, custom output sizes up to 3840px). Routes to text-to-image or the edit variant depending on whether a reference image is provided. Use for photoreal character anchors, scene keyframes, and designed sheets (e.g. storyboards) where precise layout and legible text matter.
What it loads into context
Frontmatter
133 tokensAlways available to the agent
SKILL.md
2,584 tokensWhen the skill is activated
Reference documents
1,159 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Purpose
- Inputs
- Credentials at run time
- Workflow
- Output
- Quality Checks
- Failure Modes
- Model notes
- Cross-provider parity note
- References
Scripts executed separately
scripts/generate.pyscripts/media_proxy.py
Files
SKILL.mdcore9,610 bytesSKILL.mdcore9,610 bytesSKILL.mdcore9,610 bytesSKILL.mdcore9,610 bytesscripts/generate.pyruns7,059 bytesscripts/media_proxy.pyruns58,192 bytesskill.meta.jsonasset155 bytestests/expected-output.mddoc900 bytestests/human-test.mddoc1,203 bytestests/sample-input.mddoc525 bytestests/smoke-test.mddoc1,444 bytes
Read SKILL.md
# create-image-gpt-image-fal
## Purpose
Generate one image via fal.ai's OpenAI gpt-image endpoints. Two model families are supported through a single `--model` flag:
- **`gpt-image-1`** (default) — `fal-ai/gpt-image-1`. The FAL fallback for Higgsfield's `gpt_image_2`. Fixed output sizes only. Used by:
- `video-orchestrator/lock-character` Phase 0 (anchor portrait) and Phase 1 (angle keyframes via `/edit`)
- `video-orchestrator/create-clips` Phase 1 for photoreal scenes
- the orchestrator's `generate_with_fallback.py` router on Higgsfield failure
- **`gpt-image-2`** — `openai/gpt-image-2`. The newer model; accepts **custom output sizes** (any multiple of 16, up to 3840px) and renders dense text/layouts well. Used for designed sheets such as ad storyboards.
The default stays `gpt-image-1` so existing callers and the lock-character anchor-parity contract are unaffected. Opt into the newer model with `--model gpt-image-2`.
View the complete source on GitHubcreate-imessage-mockup
When your agent uses it
Render pixel-accurate iMessage screenshot mockups (DM or group) from a thread JSON. Supports minimal, with-keyboard, and full iPhone 15 Pro frame variants. Outputs HTML + PNG.
What it loads into context
Frontmatter
71 tokensAlways available to the agent
SKILL.md
3,584 tokensWhen the skill is activated
Reference documents
1,830 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Purpose
- When to use
- Inputs
- CLI
- Output
- Workflow
- Setup (one-time)
- Files
- Testing
- Implementation pitfalls — do not re-introduce these bugs
- Known limitations
- Quality Checks
- Failure Modes
Scripts executed separately
generate.jspackage.jsonrender.jsscreenshot.jstemplates/icons.jstests/run-all.sh
Files
.gitignoreasset20 bytesSKILL.mdcore14,521 bytesSKILL.mdcore14,521 bytesSKILL.mdcore14,521 bytesSKILL.mdcore14,521 bytesSKILL.mdcore14,521 bytesSKILL.mdcore14,521 bytesexamples/dm-minimal.jsonasset375 bytesexamples/dm-with-frame.jsonasset513 bytesexamples/dm-with-keyboard.jsonasset373 bytesexamples/dm-with-typing.jsonasset601 bytesexamples/group-minimal.jsonasset699 bytesexamples/group-with-frame.jsonasset1,101 bytesgenerate.jsruns15,366 bytespackage-lock.jsonasset1,757 bytespackage.jsonruns411 bytesrender.jsruns5,602 bytesscreenshot.jsruns3,986 bytesskill.meta.jsonasset137 bytestemplates/chat.cssasset17,345 bytestemplates/icons.jsruns3,386 bytestests/expected-output.mddoc2,387 bytestests/human-test.mddoc1,817 bytestests/run-all.shruns844 bytestests/sample-input.mddoc1,744 bytestests/smoke-test.mddoc1,149 bytes
Read SKILL.md
> **Superseded:** the video kit now does this with the phone-chat part, version 1.2.0, in the parts folder of this repository. Every phone-chat style is a style file that draws the same screen frame by frame from the plan's scenes, with the original sounds, in the kit's browser. This atom stays, unchanged in behaviour, for skills outside the kit until they move; its scripts still run.
# create-imessage-mockup
Generate iMessage screenshots that look like real iOS captures — correct bubbles with tails, typing indicators, timestamps, "Delivered" captions, group avatars + sender names, keyboard chrome, and an optional iPhone 15 Pro bezel with Dynamic Island and status bar.
## Purpose
Turn a structured thread JSON into a believable iMessage screenshot — first as standalone HTML (`generate.js` + `templates/chat.css`), then rasterized to PNG with headless Chromium (`screenshot.js`/`render.js` via Playwright). It is the atom you reach for when an ad, social post, or video scene needs a fake-but-convincing iOS message capture.
What it gets right, grounded in the renderer:
- **Bubble runs and tails** — blue `sent` bubbles (right) and gray `received` bubbles (left), with a curved tear-drop tail drawn only on the *last* bubble of each consecutive sender run (`isLastOfRun` in `generate.js`).
- **Dark-themed iOS chrome** — `theme: "dark"` flips the page to the iOS dark conversation look; the status bar, Dynamic Island, and keyboard match iPhone 15 Pro.View the complete source on GitHubcreate-kinetic-typography
When your agent uses it
Render a deterministic text-only video ad from approved copy, font, colors, timing and CTA. Use when a brand needs an animated message without product photography or a creator.
What it loads into context
Frontmatter
46 tokensAlways available to the agent
SKILL.md
435 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Inputs
- Workflow
- Output and checks
- Failure modes
Scripts executed separately
scripts/render.py
Files
SKILL.mdcore2,242 bytesscripts/config.example.jsonasset394 bytesscripts/render.pyruns5,191 bytesskill.meta.jsonasset220 bytes
Read SKILL.md
# Kinetic typography
Render approved text as a silent video using the bundled renderer. No generation service is required. Review the complete copy and motion before delivery.
## Inputs
The configuration contains an even canvas size, frame rate, local font file or automatic system font, background/text/accent colors, text beats and a final CTA. Each beat has text, duration in seconds and an animation: punch, typewriter or rise. The renderer's help describes its arguments. The example configuration is a neutral layout sample; replace every creative value with the approved brief.
## Workflow
1. Lock supported copy, CTA and brand styling. Ask only for unresolved creative choices.
2. Write the configuration. Hold every beat for 1.5–10 seconds and allow at least three seconds for the CTA. Long copy is wrapped; excessive lines or an oversized word are rejected. Split copy into more beats instead of shrinking it.
3. Render the video and optional contact sheet with the bundled renderer. It uses Pillow and ffmpeg and makes no paid calls.
4. Inspect the full video and sheet: readable holds, safe text, intact letters, correct colors/font and complete ending. Review motion as well as held frames.View the complete source on GitHubcreate-music-elevenlabs
When your agent uses it
Generate an instrumental music bed via ElevenLabs Music, routed through the GooseWorks proxy, so the call is charged to your GooseWorks credits. Trims any sparse intro, loudnorm, fades the tail. Prompt + length from the template recipe. Use for the music layer of any video-ad format.
What it loads into context
Frontmatter
91 tokensAlways available to the agent
SKILL.md
527 tokensWhen the skill is activated
Reference documents
69 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Contract
- Model notes
Scripts executed separately
scripts/gen_music.pyscripts/media_proxy.py
Files
SKILL.mdcore2,235 bytesscripts/gen_music.pyruns1,163 bytesscripts/media_proxy.pyruns58,192 bytesskill.meta.jsonasset224 bytestests/smoke-test.mddoc270 bytes
Read SKILL.md
> **Superseded:** the video kit now does this with the music-elevenlabs part, version 1.0.2, in the parts folder of this repository. It orders the bed through the private line and levels and fades it the same way. This atom stays, unchanged in behaviour, for skills outside the kit until they move; its scripts still run.
# create-music-elevenlabs
Generate an instrumental music bed via ElevenLabs Music, routed through the GooseWorks proxy, so the call is charged to your GooseWorks credits. Trims any sparse intro, loudnorm, fades the tail. Prompt + length from the template recipe. Use for the music layer of any video-ad format.
## Run
gen_music.py --prompt '...' --duration 10 --out music.m4a — charged to your GooseWorks credits; writes a duration-clamped, loudnorm'd bed.
## Contract
- Paid calls route through the GooseWorks proxies (charged to your GooseWorks credits) via the
bundled `media_proxy.py` — never a provider SDK's default host.
- The template recipe (DB) supplies the model + params; this capability is generic.
View the complete source on GitHubcreate-video-fal
When your agent uses it
Image-to-video (or text-to-video) via any FAL video model (Kling, Seedance, Veo), routed through the GooseWorks proxy, so the call is charged to your GooseWorks credits. The template recipe names the model + params; image_url inputs must be public URLs (the orchestrator hosts local frames with the MCP media_upload). Returns the result video URL and downloads it. Use for the generative base clip of any video-ad format.
What it loads into context
Frontmatter
106 tokensAlways available to the agent
SKILL.md
1,238 tokensWhen the skill is activated
Reference documents
80 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Contract
- Rejection, physical constraints and cast planning
- Model notes
Scripts executed separately
scripts/gen_video.pyscripts/media_proxy.py
Files
SKILL.mdcore5,359 bytesscripts/gen_video.pyruns968 bytesscripts/media_proxy.pyruns58,192 bytesskill.meta.jsonasset177 bytestests/smoke-test.mddoc317 bytes
Read SKILL.md
# create-video-fal
Image-to-video (or text-to-video) via any FAL video model (Kling, Seedance, Veo), routed through the GooseWorks proxy, so the call is charged to your GooseWorks credits. The template recipe names the model + params; image_url inputs must be public URLs (the orchestrator hosts local frames with the MCP media_upload). Returns the result video URL and downloads it. Use for the generative base clip of any video-ad format.
## Run
gen_video.py --model fal-ai/kling-video/v3/pro/image-to-video --payload '{...}' --out clip.mp4 — charged to your GooseWorks credits; host-swaps the FAL queue URLs; downloads the result.
## Contract
- Paid calls route through the GooseWorks proxies (charged to your GooseWorks credits) via the
bundled `media_proxy.py` — never a provider SDK's default host.
- The template recipe (DB) supplies the model + params; this capability is generic.
## Rejection, physical constraints and cast planning
View the complete source on GitHubcreate-video-seedance-2-fal
When your agent uses it
Generate a single 4-15s vertical video clip with ByteDance Seedance 2.0 reference-to-video via fal.ai, for shots with no realistic face (a product hero, a product in motion, an empty set). Multi-image reference (product + setting), ambient audio, internal multi-cut handling within one render, 720p by default. Routes through the GooseWorks FAL proxy (charged to your GooseWorks credits). Seedance refuses photoreal faces, so talking heads and creators go to creator-h3 / video-h3max.
What it loads into context
Frontmatter
155 tokensAlways available to the agent
SKILL.md
6,255 tokensWhen the skill is activated
Reference documents
1,305 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Purpose
- Inputs
- Decision Rules
- Workflow
- Output
- Pricing (2026-05)
- Prompt template
- Quality Checks
- Failure Modes
- Recovery — re-attach to a paid job, never re-fire
- References
- Provider rejection and scene acceptance
Scripts executed separately
scripts/generate.pyscripts/media_proxy.pytests/test_seedance_policy_rejection.py
Files
SKILL.mdcore24,913 bytesSKILL.mdcore24,913 bytesSKILL.mdcore24,913 bytesSKILL.mdcore24,913 bytesscripts/generate.pyruns9,967 bytesscripts/media_proxy.pyruns58,192 bytesskill.meta.jsonasset167 bytestests/expected-output.mddoc902 bytestests/human-test.mddoc999 bytestests/sample-input.mddoc1,588 bytestests/smoke-test.mddoc1,440 bytestests/test_seedance_policy_rejection.pyruns10,216 bytes
Read SKILL.md
> **Superseded** in the video kit by the video-seedance-2 part (1.3.0, 720p by default; scripted lines use creator-h3). This atom still runs, unchanged, for skills outside the kit.
# create-video-seedance-2-fal
> ⚠<U+FE0F> **REQUIRED PREFLIGHT (2026-06-04): every Seedance prompt that names a branded product MUST be paired with a real reference image of that exact product** as one of the `--image-ref` inputs. Text-only product description without a ref invites Seedance to invent geometry that does not match the real SKU. If none exists, take one from the brand's assets, existing ads or product page; clean an occluded one with a gpt-image-2 edit first.
## Purpose
Wraps the FAL endpoint `bytedance/seedance-2.0/reference-to-video`. Pass 1-N image references (product + optional empty setting, **never a photoreal face**) + a structured prompt → get back a 4-15s clip with ambient audio, at 720p by default.
**Seedance refuses photoreal faces, whatever model made them** (a fresh Seedream v5 Pro face too, 2026-09-29), and a refused submit still bills. Talking heads and any shot with a realistic face go to `creator-h3` / `video-h3max` (H3). In a GooseWorks custom video Seedance always needs the customer's new yes to its price, saved in the approved review; send that call's `--query` (below).
Seedance 2.0 renders **multiple internal cuts within a single 15s call** when the prompt specifies sub-scene structure (e.g. WIDE HOOK / PRODUCT HERO / SIDESTEP / REACTION). This is the architectural win over the older NB2 + i2v multi-keyframe approach — fewer calls, native lip-sync, no Soul ID required.
View the complete source on GitHubcreate-vo-elevenlabs
When your agent uses it
Generate a voiceover (VO) clip via ElevenLabs text-to-speech, routed through the GooseWorks proxy, so the call is charged to your GooseWorks credits. Voice id + script text come from the template recipe. Use for the spoken narration of VO-driven video-ad formats (cgi-app-sizzle, flat-vector-explainer, hypermotion). Never call ElevenLabs directly — the proxy attribution is required.
What it loads into context
Frontmatter
114 tokensAlways available to the agent
SKILL.md
1,354 tokensWhen the skill is activated
Reference documents
30 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Brand pronunciations
- Read confirmed pronunciation before spending
- Model-specific performance and timing
- Pace: measured, and --target-wps
- Character timings for video
Scripts executed separately
scripts/gen_vo.pyscripts/media_proxy.pyscripts/read_pronunciations.pytests/test_gen_vo.pytests/test_pace.pytests/test_timestamps.py
Files
SKILL.mdcore6,078 bytesSKILL.mdcore6,078 bytesscripts/gen_vo.pyruns12,416 bytesscripts/media_proxy.pyruns58,192 bytesscripts/read_pronunciations.pyruns3,801 bytesskill.meta.jsonasset221 bytestests/smoke-test.mddoc98 bytestests/test_gen_vo.pyruns1,025 bytestests/test_pace.pyruns4,204 bytestests/test_timestamps.pyruns3,359 bytes
Read SKILL.md
> **Superseded:** the video kit now does this with the voice-elevenlabs part, version 1.3.0 (`voice-elevenlabs@1.3.0`), in the parts folder of this repository. It speaks every scene's line through the private line, keeps character timings as word timings and swaps in confirmed pronunciations the same way. The compatibility generator also supports Eleven v4 controls and pending timing provenance. Existing frozen part versions are unchanged.
# create-vo-elevenlabs
VO via the elevenlabs-proxy (charged to your GooseWorks credits). `gen_vo.py --text "..." --voice <id> --out vo.mp3`.
The template recipe supplies the voice + text; paid call routes through media_proxy.
## Brand pronunciations
A brand name or product name the voice gets wrong is spoken from its phonetic
spelling, never from a `(pronounced …)` note (the voice reads notes aloud):
```bash
gen_vo.py --text "Meet Brewq2." --voice <id> --out vo.mp3 --rules working/brand-rules.jsonView the complete source on GitHubfootage-cutlist
When your agent uses it
Watch a brand's own product footage (screen recording, product film), pick the moment that proves each line with the user, and render those picks as a product layer — free, local. survey.py turns footage into timestamped contact sheets + scene cuts + motion so the agent can actually look at it; the agent writes a cut list (beat → source window + framing); preview.py draws it as a review sheet the user corrects round by round; cut.py renders the approved list into a silent 1080x1920 layer with the creator's area left as a plate. Also frames footage as a filmed screen (keystone, bezel, handheld drift) with dissolves between beats, and takes still screenshots as sources. Use for any format that shows real product footage beside, between or instead of a creator (split-screen, screen inserts, walkthroughs).
What it loads into context
Frontmatter
184 tokensAlways available to the agent
SKILL.md
2,141 tokensWhen the skill is activated
Reference documents
225 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- The cut list
- Rules that were learned the hard way
- Going back and forth with the user
- Product-photo motion and caption review
Scripts executed separately
scripts/_common.pyscripts/cut.pyscripts/cutlist.pyscripts/filmed.pyscripts/photo.pyscripts/preview.pyscripts/survey.py
Files
SKILL.mdcore8,177 bytesSKILL.mdcore8,177 bytesSKILL.mdcore8,177 bytesSKILL.mdcore8,177 bytesSKILL.mdcore8,177 bytesSKILL.mdcore8,177 bytesSKILL.mdcore8,177 bytesSKILL.mdcore8,177 bytesSKILL.mdcore8,177 bytesSKILL.mdcore8,177 bytesSKILL.mdcore8,177 bytesSKILL.mdcore8,177 bytesscripts/_common.pyruns4,326 bytesscripts/cut.pyruns11,831 bytesscripts/cutlist.pyruns7,926 bytesscripts/filmed.pyruns5,831 bytesscripts/photo.pyruns2,726 bytesscripts/preview.pyruns7,378 bytesscripts/survey.pyruns6,248 bytesskill.meta.jsonasset200 bytestests/smoke-test.mddoc853 bytes
Read SKILL.md
# footage-cutlist
Picking which moment of a customer's footage plays under which line is a **judgement**,
not a formula. A position map ("beat 3 is 40% through the reel, so take the footage 40%
through") was measured up to 5.7s off a person's picks on a reference build. So this
capability does the free, mechanical parts and leaves the decision to the agent and the
user:
| Step | Script | Who decides |
|---|---|---|
| Look at the footage | `survey.py` | nobody; it just shows it |
| Choose a window per line | the agent writes `cutlist.json` | agent, then the user |
| Show the choices | `preview.py` | the user corrects them |
| Render the approved choices | `cut.py` | nobody |View the complete source on GitHubmedia-proxy
When your agent uses it
Shared helper that routes ALL paid media generation (FAL image/video, ElevenLabs music) through the GooseWorks proxies so every call is charged to your GooseWorks credits — never a provider SDK's default host. Host-swaps the FAL queue URLs, loads the agent token from the sandbox env (GW_MEDIA_PROXY_TOKEN) or ~/.gooseworks/credentials.json, and returns the result CDN URL. Every video-ad media capability imports this; templates never call a provider directly.
What it loads into context
Frontmatter
117 tokensAlways available to the agent
SKILL.md
3,998 tokensWhen the skill is activated
Reference documents
153 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Crash-resume (never lose / double-bill a paid render)
- Policy rejections are final: surface, do not retry
- Use it
- Save-as-you-go digest
- Contracts (load-bearing)
- No credentials at all? The MCP relay
- Large request bodies without prompt copying
- Related
Scripts executed separately
scripts/media_proxy.pyscripts/resume.pytests/test_call_query.pytests/test_media_proxy_policy.py
Files
SKILL.mdcore15,528 bytesSKILL.mdcore15,528 bytesSKILL.mdcore15,528 bytesSKILL.mdcore15,528 bytesSKILL.mdcore15,528 bytesSKILL.mdcore15,528 bytesscripts/media_proxy.pyruns58,192 bytesscripts/resume.pyruns2,268 bytesskill.meta.jsonasset126 bytestests/smoke-test.mddoc655 bytestests/test_call_query.pyruns2,947 bytestests/test_media_proxy_policy.pyruns25,930 bytes
Read SKILL.md
# media-proxy
The foundation capability for paid media in the video-ad pipeline. It fixes the
auth-path conflict where engine scripts called FAL/ElevenLabs **directly** (billing
the wrong account): all paid calls now go through
[Credential-related source omitted]
**is charged to your GooseWorks credits**.
## Crash-resume (never lose / double-bill a paid render)
A FAL submit BILLS immediately, but the local backend can blip during a multi-minute
render. Two built-in protections (automatic for every capability that imports this):
- **Poll-through-outage** — `_fal_run`'s poll loop re-attaches to the same status/result
URL through `connection refused` / timeout blips instead of crashing.View the complete source on GitHubmix-master
When your agent uses it
Canonical short-form-ad audio mix in one FFmpeg pass. VO loudnorm + 3.0× per-clip + 2.0× mix, music 0.13 base + apad+afade, sidechain compress 20:1 @ 0.01, climax line +20%, optional video-to-music duration sync. Replaces the reactive multi-round tuning that cost v03 6+ passes.
What it loads into context
Frontmatter
123 tokensAlways available to the agent
SKILL.md
1,763 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Purpose
- Inputs
- Workflow
- Output
- Quality Checks
- Failure Modes
- Example
Scripts executed separately
scripts/mix.sh
Files
SKILL.mdcore6,003 bytesSKILL.mdcore6,003 bytesscripts/mix.shruns8,246 bytesskill.meta.jsonasset180 bytes
Read SKILL.md
> **Superseded:** the video kit now does this with the audio-mix part, version 1.0.1 and the sound-layer part, version 1.0.4, in the parts folder of this repository. Its mix mode is the audio-mix step (voice, a ducked bed and timed effects) and its finish mode is the sound layer, which levels every video to -14 LUFS with the true peak at or below -1 dBTP. This atom stays, unchanged in behaviour, for skills outside the kit until they move; its scripts still run.
# mix-master
## Purpose
The v03 Ironman LEARNINGS describe 6+ tuning rounds because no default mix protocol existed: round 1 music too loud, round 2 VO too quiet, round 3 Whisper mis-transcribed, round 4 sidechain ratio finally right, round 5 music ended too early, round 6 climax sat at the same loudness as the rest.
This atom encodes the protocol that landed and ships it as the default. Operators tune by flag; they don't redesign the chain.
## Inputs
- `--video <path>` — video file with no audio (or whose audio gets dropped) (required)
- `--vo <path,path,...>` — comma-separated list of per-scene VO mp3s in scene order (required)View the complete source on GitHubrender-3d-character-explainer
When your agent uses it
Assemble an animated character-explainer video ad (~77s, 9:16, any art style: Pixar-style 3D, claymation, anime, paper-cut, felt) on an "N types of X" listicle spine: one recurring human protagonist plus one persona character per list item. Given per-scene clips, a scene timing table and narration, it trims, normalises, concatenates and mixes them, reusing the source ad's audio (restyle) or fresh per-scene voiceover over a music bed (original), loops a scene's keyframe when its clip failed, and burns captions last. Free, deterministic assembly (Python and ffmpeg, no paid calls); the recipe supplies the clips, keyframes, audio and captions. Use for the 3d-character-explainer format.
What it loads into context
Frontmatter
186 tokensAlways available to the agent
SKILL.md
2,373 tokensWhen the skill is activated
Reference documents
1,362 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Two modes
- What it does (the deterministic recipe)
- Scripts (free — Python + ffmpeg, no bash, no paid calls)
- Inputs (all via `--config` + a runtime work dir — NO hardcoded paths)
- Craft rules (load-bearing — faithful to the source molecule + reference run)
- Requires
Scripts executed separately
scripts/compose.pyscripts/make_captions.py
Files
SKILL.mdcore9,060 bytesSKILL.mdcore9,060 bytesSKILL.mdcore9,060 bytesSKILL.mdcore9,060 bytesSKILL.mdcore9,060 bytesSKILL.mdcore9,060 bytesSKILL.mdcore9,060 bytesSKILL.mdcore9,060 bytesSKILL.mdcore9,060 bytesSKILL.mdcore9,060 bytesscripts/compose.pyruns11,937 bytesscripts/config.example.jsonasset4,482 bytesscripts/make_captions.pyruns3,278 bytesskill.meta.jsonasset239 bytestests/smoke-test.mddoc4,284 bytes
Read SKILL.md
# render-3d-character-explainer
The free, deterministic renderer for the **3d-character-explainer** video ad format — an
animated character spot (art style is the user's choice; the demo was glossy Pixar-style 3D) built on an **"N types of X" listicle** spine, where a recurring
human protagonist plus a locked cast of **N persona characters (one per list item)** carry a
hook → "deeper story" → cast-reveal → one beat per list item → kicker → product test →
relieved payoff. This capability is the **FREE assembly stage only**. All generative work
(Nano-Banana cast anchors + per-scene keyframes, Kling-V3 i2v clips, ElevenLabs VO + music,
or a source ad's audio reused verbatim) happens upstream in the recipe and is handed to this
capability as files.
It ports the validated compose recipe from the worked example — a "six types" Pixar-style 3D
listicle restyle (`_render_full.sh` — per-scene trim → normalize 1080×1920/fps30 → concat -c copy → mux the
source audio, with a static-still fallback on any failed clip). The assembly isView the complete source on GitHubrender-3d-product-showcase
When your agent uses it
Assemble a premium 3D product-showcase ad from a config — four beat clips (an orbiting hero rotation, a macro push-in, a physics reveal, a typographic close) normalized to the chosen backdrop colour, hard-concatenated in order, closed on a deterministic Playwright brand end card, and mixed under one instrumental bed at loudnorm I=-16 (music-only, no VO). Ships the runnable build_endcard.py + build_masters.py; the rotation/macro clips are create-video-fal i2v seeded on a create-image-fal styled hero, the reveal is Veo3 i2v, and the bed is create-music-elevenlabs. Use for the 3d-product-showcase format.
What it loads into context
Frontmatter
165 tokensAlways available to the agent
SKILL.md
1,339 tokensWhen the skill is activated
Reference documents
3,075 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Run
- Contract (the free assembly)
Scripts executed separately
scripts/build_endcard.pyscripts/build_masters.pyscripts/shoot.js
Files
SKILL.mdcore5,047 bytesSKILL.mdcore5,047 bytesscripts/PIPELINE.mddoc5,777 bytesscripts/README.mddoc3,919 bytesscripts/build_endcard.pyruns5,932 bytesscripts/build_masters.pyruns4,881 bytesscripts/config.example.jsonasset11,057 bytesscripts/shoot.jsruns1,189 bytesskill.meta.jsonasset236 bytestests/smoke-test.mddoc1,114 bytes
Read SKILL.md
# render-3d-product-showcase
Assemble a premium **3D product-showcase** ad from a config: one real product floats centered
on a clean seamless backdrop (colour and lighting chosen per brand) and sells itself across four beats — an orbiting hero
rotation, a macro push-in on the surface detail, a physics reveal (`exploded_view` /
`particle_disintegration` / `liquid_splash`, or `rotation_only`), then a typographic brand
close. This capability is the **FREE, deterministic assembly** that stitches the delivered
beats into the master; it spends nothing.
`scripts/config.example.json` is the worked example (Quillmere Pen Co. "Meridian 14", ~15s
720×1280 9:16); `scripts/build_endcard.py` + `scripts/build_masters.py` are the runnable free
assembly; `scripts/PIPELINE.md` maps every config block to its source step; `scripts/README.md`
documents the assembly.
View the complete source on GitHubrender-absurdist-explainer
When your agent uses it
Assemble an absurdist animated-explainer video ad (~38s, 9:16) from per-scene i2v clips + their measured VO windows — retime each clip to its VO, re-encode every segment to identical 30fps/libx264/yuv420p so the concat demuxer never drops frames, concat, build a REAL-product PIL end card (never AI) held static, mix VO (loudnorm I=-14) under music (loudnorm I=-26, volume 0.62, amix normalize=0), and burn libass captions last. FREE deterministic assembly (bash-free, Python + ffmpeg + PIL); the recipe supplies the clips, VO, music, product photo, palette, and caption table and gates the paid keyframe/clip/VO/music calls to their own capabilities. Use for the absurdist-explainer format.
What it loads into context
Frontmatter
198 tokensAlways available to the agent
SKILL.md
2,612 tokensWhen the skill is activated
Reference documents
1,199 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- What it does (the deterministic recipe)
- Scripts (free — Python + ffmpeg + PIL, no bash, no paid calls)
- Inputs (all via `--config` + a runtime work dir — NO hardcoded paths)
- Craft rules (load-bearing — faithful to the source molecule)
- Known gaps
- Requires
Scripts executed separately
scripts/build_endcard.pyscripts/compose.pyscripts/make_captions.py
Files
SKILL.mdcore9,701 bytesSKILL.mdcore9,701 bytesscripts/build_endcard.pyruns7,515 bytesscripts/compose.pyruns16,889 bytesscripts/config.example.jsonasset4,570 bytesscripts/make_captions.pyruns3,466 bytesskill.meta.jsonasset236 bytestests/smoke-test.mddoc4,339 bytes
Read SKILL.md
# render-absurdist-explainer
The free, deterministic renderer for the **absurdist-explainer** video ad format — an
animated spot that explains one problem and how the product fixes it. The format is the
mechanics: show the problem in a funny, exaggerated cartoon way, teach the product's
ownable mechanism visually, show what the problem costs, bring the product in, land the
fix as the climax, pay it off, end on a real-product card. One narrator voice carries the
whole spot. *How* the story is told (problem → fix, how it works, a day in the life, the
product as hero, or a villain arc) is the user's choice, made upstream. This capability
is the **FREE assembly stage only**. All generative work (nano-banana keyframes, Seedance
i2v clips, ElevenLabs VO + music) happens upstream in the recipe and is handed to this
capability as files.
It ports the compose recipe validated on two earlier reference runs (both happened toView the complete source on GitHubrender-airdrop-carousel
When your agent uses it
Assemble a viral iOS "AirDrop" notification-carousel video ad (≈6–8s, 9:16) from a brand line plus 6–16 real product photos — a native AirDrop share-sheet card ("Brand would like to share a ___ · Decline / Accept") springs up and its preview window CYCLES through the products, landing on a range/lineup payoff with an Accept tap; a chime + soft per-swap ticks track the swaps. DETERMINISTIC assembly — an HTML card (real DOM text) rendered to PNG via headless Chrome, chroma-keyed, its magenta window refilled per-product in PIL, then animated + audio-synthed with FFmpeg. FREE (no paid model calls); the recipe supplies the brand line, product images, and payoff and gates the only optional paid step (a hero shot when the brand has NO usable photo → create-image-fal). Use for the airdrop-notification-carousel format.
What it loads into context
Frontmatter
213 tokensAlways available to the agent
SKILL.md
1,415 tokensWhen the skill is activated
Reference documents
1,149 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Scripts (free)
- Inputs the recipe binds (choices vs brand facts)
- Chroma contract (load-bearing — build_card.py and compose_carousel.py MUST share it)
- Craft rules (faithful to the source molecule)
- Requires
Scripts executed separately
scripts/build_card.pyscripts/compose_carousel.pyscripts/one_shot.py
Files
SKILL.mdcore5,467 bytesSKILL.mdcore5,467 bytesscripts/build_card.pyruns5,080 bytesscripts/compose_carousel.pyruns9,507 bytesscripts/config.example.jsonasset1,528 bytesscripts/one_shot.pyruns4,491 bytesskill.meta.jsonasset218 bytestests/smoke-test.mddoc4,294 bytes
Read SKILL.md
# render-airdrop-carousel
The free, deterministic renderer for the **airdrop-notification-carousel** video ad
format — the viral iOS "AirDrop" trend where a native share-sheet card
("**Brand** would like to share a *candle* · Decline / Accept") springs up on the
phone and its preview window flips through a **carousel of real product photos**,
landing on a range/lineup payoff with an Accept tap.
This is a DETERMINISTIC composite — **no generative video, no AI-rendered product**.
A real-DOM AirDrop card is rendered once to PNG (headless Chrome), chroma-keyed, and
its preview window is refilled per-product in PIL, then animated + audio-synthed with
FFmpeg. The whole point of the format is crisp system-UI text and **real** product
photography, both of which a video model would smear. This capability makes **no paid
calls**; the recipe gates the only optional paid step — generating a hero product shotView the complete source on GitHubrender-brand-identity-reveal
When your agent uses it
Render a 'brand identity reveal' video from a config — a single poster frame in a real, softly-lit space (real wall, soft-focus plant in the corner, dappled leaf shadow, illuminated poster) whose artwork HARD-CUTS through ~10 on-brand poster mockups (hero product, IG post, hanging banners, sticker sheet, logo lockup, poster, two lifestyle stills, packaging, big icon) then holds on a brand end card. The environment plate is one create-image-fal generation; the mockups are real-DOM HTML frame-stepped via Playwright, perspective-composited into the detected frame quad with the plate's real leaf-shadow multiplied back onto each poster (reads as behind glass), sequenced by FFmpeg. Deterministic assembly, FREE (the plate comes from create-image-fal, the bed from create-music-elevenlabs), music bed only and approved brand copy only. Use for the brand-identity-reveal format.
What it loads into context
Frontmatter
212 tokensAlways available to the agent
SKILL.md
1,325 tokensWhen the skill is activated
Reference documents
1,282 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Three layers
- Inputs
- Workflow (free assembly)
- Rules
- Failure Modes
Scripts executed separately
scripts/build_video.shscripts/composite.pyscripts/measure_frame.pyscripts/recrop.pyscripts/render_art.py
Files
SKILL.mdcore5,476 bytesSKILL.mdcore5,476 bytesSKILL.mdcore5,476 bytesSKILL.mdcore5,476 bytesSKILL.mdcore5,476 bytesSKILL.mdcore5,476 bytesSKILL.mdcore5,476 bytesSKILL.mdcore5,476 bytesSKILL.mdcore5,476 bytesSKILL.mdcore5,476 bytesscripts/PIPELINE.mddoc3,557 bytesscripts/build_video.shruns1,264 bytesscripts/composite.pyruns3,103 bytesscripts/config.example.jsonasset4,039 bytesscripts/measure_frame.pyruns1,696 bytesscripts/recrop.pyruns2,280 bytesscripts/render_art.pyruns1,303 bytesscripts/scene.htmlasset20,865 bytesskill.meta.jsonasset223 bytestests/smoke-test.mddoc1,164 bytes
Read SKILL.md
# render-brand-identity-reveal
Render the 'brand identity reveal' format from a config. The signature is a single fixed
poster frame in a REAL, softly-lit space (the illuminated poster-frame look of a shop, café,
cinema or metro — the setting and wall are chosen per video): a real wall, a real soft-focus plant in the lower-left corner, dappled
leaf shadow. The artwork INSIDE the frame HARD-CUTS (no crossfade) through 11 beats — 10
on-brand poster mockups + a brand END CARD held ~3s. Music bed only, NO voiceover; copy is
baked into each mockup, never overlaid as captions.
This capability is the **FREE** assembly only. The paid parts are separate generic
capabilities the recipe names — `create-image-fal` (the one-shot environment plate) and
`create-music-elevenlabs` (the bed). Never re-implement them here.
## ChoicesView the complete source on GitHubrender-cartoon-music-video
When your agent uses it
Assemble a cartoon / animated / hand-crafted music-video ad from a config — a sung song carries the whole narrative while N per-bar i2v clips (one recurring animated character, one look pack) are each cut to their BAR window from librosa beat-tracking and hard-concatenated on the bar, VEED-whisper white bold-sans captions in the BOTTOM third (Alignment 2, above the logo bug, no pill) burned from the song's word timings re-spelled against the locked lyrics, a persistent brand logo bug held over the body (suppressed on the end card), and closed on a solid-brand-color PIL end card with the song still playing under it — never AI-rendered text. This is the FREE deterministic assembly stage (cut-to-bar + hard concat + logo bug + captions + end card + song mux); the song, character, keyframes, and clips come from create-music-elevenlabs / create-image-fal / create-video-fal. Use for the cartoon-music-video format.
What it loads into context
Frontmatter
224 tokensAlways available to the agent
SKILL.md
1,589 tokensWhen the skill is activated
Reference documents
3,914 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Run
- Contract (the free assembly)
Files
SKILL.mdcore6,218 bytesSKILL.mdcore6,218 bytesscripts/PIPELINE.mddoc8,621 bytesscripts/README.mddoc4,589 bytesscripts/config.example.jsonasset22,255 bytesskill.meta.jsonasset181 bytestests/smoke-test.mddoc1,057 bytes
Read SKILL.md
# render-cartoon-music-video
Assemble a **cartoon music-video** ad from a config: an animated / illustrated / hand-crafted
story (stop-motion felt-and-foam, claymation, 2D toon, cut-out) where a sung song is the entire
script and one recurring animated character carries every shot, cut to the bar with the climax
line on the drop. This capability is the **FREE, deterministic assembly** — cut-to-bar,
hard-concat, the logo bug + captions burn, and the solid-color end card.
`scripts/config.example.json` is the worked example (Sudsabout "Fresh by morning", ~55s 1080×1920
9:16, 16 body bars + a 3s end card — its felt look, character, story and song are that demo's
picks, never defaults); `scripts/PIPELINE.md` maps every config block to its source
step and `scripts/README.md` documents the free assembly.
## ChoicesView the complete source on GitHubrender-cgi-sizzle
When your agent uses it
Assemble a 3D-CGI app sizzle — nano-banana CGI plates (blank-glow floating phone + a CGI studio with rim-light + placeholder burst shapes; studio look and phone finish come from the recipe choices) plus PIL compositing of the REAL App Store screenshots onto the bezel + burst-out overlays, driven by Kling 3.0 i2v steady-float per beat with a per-beat Ken-Burns FFmpeg push-in fallback when Kling garbles the UI, then VO/music mix (sidechain duck, loudnorm) + 1.15x speed + anti-AI grain finalize. The on-screen UI, any faces in it, and the wordmark are ALWAYS real assets composited via PIL — never AI-rendered. The paid steps (plates, i2v clips, VO, music) are separate capabilities; this ships the config + PIPELINE + FREE assembly and the recipe orchestrates the spend. Use for the cgi-app-sizzle video format.
What it loads into context
Frontmatter
214 tokensAlways available to the agent
SKILL.md
1,443 tokensWhen the skill is activated
Reference documents
2,753 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Run
- Contract
Files
SKILL.mdcore5,645 bytesscripts/PIPELINE.mddoc4,229 bytesscripts/README.mddoc4,523 bytesscripts/config.example.jsonasset13,483 bytesskill.meta.jsonasset172 bytestests/smoke-test.mddoc1,402 bytes
Read SKILL.md
# render-cgi-sizzle
Assembles the **3D-CGI app sizzle** video format: a phone floats in a CGI studio while five
or six app features demo one per beat — each beat bursts REAL App Store UI elements out of
the phone in 3D with rim-light + bokeh, then everything collapses back into the screen at a
value-prop climax + a brand end card over a music bed. It reads as an Apple-keynote product
film, not UGC and not a physical-product shoot.
The worked example (`scripts/config.example.json`) is the fictional trail-map app Trailvane: a gold phone in a
smoky-black studio with an amaranth rim-light, an "Eryn" keynote-cadence VO, a premium-tech
piano/synth bed, and an "Every trail worth walking. One app." climax. Those are **one example**, not defaults.
## Choices
View the complete source on GitHubrender-chatgpt-chat
When your agent uses it
Assemble a ChatGPT chat-reveal video ad from a thread + timeline JSON — one continuous Playwright recording of a ChatGPT mobile chat (user types with the iOS keyboard up → taps send → keyboard slides down + header cluster swaps in one beat → one gray loading dot → the assistant answer streams in word-by-word) crossfaded into a designed end card, with subliminal ChatGPT SFX and an optional ducked music bed. FREE assembly (Playwright + ffmpeg); the recipe supplies the per-brand thread + timeline + end-card config and gates the paid music call to its own capability. The ChatGPT sibling of render-imessage-chat. Use for the chatgpt-chat format.
What it loads into context
Frontmatter
169 tokensAlways available to the agent
SKILL.md
2,503 tokensWhen the skill is activated
Reference documents
687 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- What it renders
- Run
- The chat body: bundled create-chatgpt-mockup
- Timeline events (consumed by record-chat.js)
- Contract
- Gaps / routing notes
- Self-QC (per project rule — always /watch the master)
Scripts executed separately
scripts/mockup/generate.jsscripts/mockup/templates/icons.jsscripts/package.jsonscripts/record-chat.jsscripts/render-end-card.jsscripts/stitch.sh
Files
SKILL.mdcore9,481 bytesSKILL.mdcore9,481 bytesSKILL.mdcore9,481 bytesSKILL.mdcore9,481 bytesSKILL.mdcore9,481 bytesassets/sfx/key-tap.wavasset3,166 bytesassets/sfx/response-done.wavasset14,190 bytesassets/sfx/send-tap.wavasset8,016 bytesassets/sfx/stream-tick.wavasset2,018 bytesscripts/config.example.jsonasset3,541 bytesscripts/end-card.template.htmlasset2,563 bytesscripts/mockup/generate.jsruns16,686 bytesscripts/mockup/templates/chat.cssasset16,985 bytesscripts/mockup/templates/icons.jsruns11,820 bytesscripts/package.jsonruns320 bytesscripts/record-chat.jsruns14,883 bytesscripts/render-end-card.jsruns6,331 bytesscripts/stitch.shruns6,756 bytesskill.meta.jsonasset229 bytestests/smoke-test.mddoc2,435 bytes
Read SKILL.md
> **Superseded:** the video kit now does this with the phone-chat part, version 1.2.0, in the parts folder of this repository. Every phone-chat style is a style file that draws the same screen frame by frame from the plan's scenes, with the original sounds, in the kit's browser. This atom stays, unchanged in behaviour, for skills outside the kit until they move; its scripts still run.
# render-chatgpt-chat
The free renderer for the **chatgpt-chat** video ad format — the "I just asked
ChatGPT…" creative, where someone asks ChatGPT a question and the *streamed
assistant answer is the punchline* (the brand surfacing as the natural response).
Deterministic Playwright + ffmpeg assembly; no generative video of the UI, so the
bubble text and streamed answer stay pixel-crisp.
This is the **ChatGPT sibling of `render-imessage-chat`**. Reach for this one when
ChatGPT is the more credible host for the answer; reach for iMessage when the
punchline is a peer's reaction in a DM. The template recipe (DB) supplies the
per-brand `thread` + `timeline` + `end_card` config and gates the paid music callView the complete source on GitHubrender-cinematic-music-video
When your agent uses it
Assemble a cinematic live-action-style music-video ad from a config — an original sung anthem carries the whole narrative while N 35mm-film-look i2v clips are each cut to their lyric window and hard-concatenated on the beat as a 3-act arc, the anthem muxed at loudnorm I=-14, cinematic lower-third serif captions built from the song's OWN word timings (never Whisper) with the hook line landing on the chorus drop, and closed on a brand end card composited from the real asset — never AI-rendered text. This is the FREE deterministic assembly stage (cut-to-window + hard concat + anthem mux + captions + end card); the anthem, keyframes, and clips come from create-music-elevenlabs / create-image-gpt-image-fal / create-video-fal. Use for the cinematic-music-video format.
What it loads into context
Frontmatter
189 tokensAlways available to the agent
SKILL.md
1,326 tokensWhen the skill is activated
Reference documents
7,761 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Choices
- Contract (the free assembly)
Files
SKILL.mdcore5,417 bytesSKILL.mdcore5,417 bytesscripts/PIPELINE.mddoc10,253 bytesscripts/README.mddoc3,010 bytesscripts/config.example.jsonasset23,476 bytesskill.meta.jsonasset211 bytestests/smoke-test.mddoc1,209 bytes../stitch-videos-ffmpeg/SKILL.mddoc13,689 bytes
Read SKILL.md
# render-cinematic-music-video
Assemble a **cinematic music-video** ad from a config: a live-action-STYLE short film where an
original sung anthem is the score and every visual beat is a shot-on-film tableau (Kodak Portra
grain, light leaks, natural light, handheld imperfection) timed to the lyrics, arranged as a
3-act arc (its shape is the user's `story_arc` choice) with the hook line on the chorus drop. This capability is
the **FREE, deterministic assembly** — cut-to-window, hard-concat, anthem mux, caption burn,
and the brand end card.
`scripts/config.example.json` is the worked example (Sundrift "Roll On", ~28s
1080×1920 9:16, 14 tableaux) — copy its structure, never its creative values; `scripts/PIPELINE.md` maps every config block to its source step
and `scripts/README.md` documents the free assembly.
## RunView the complete source on GitHubrender-cosmic-mythology-voiceover
When your agent uses it
Assemble a cosmic-mythology-voiceover reel from a config — one spoken voiceover carries the whole narrative while N curated stills in one chosen look are weighted beat-synced across the delivered VO duration (cut_dur = VO_dur times weight over the weight sum, so emotional beats hold longer), Ken-Burns-zoomed per still (scale 2x, center crop, zoompan, fade-in first and fade-out last), ffmpeg-concatenated, the VO composited under the picture (libx264 crf18 plus aac), the ONE on-screen hook line faded on over the open with a drawtext alpha window, and Whisper/VEED captions burned along the bottom — never in-world text on a still. This is the FREE deterministic assembly stage (weighted sequence plus Ken-Burns plus concat plus VO composite plus hook overlay plus caption burn); the VO and the stills come from create-vo-elevenlabs and create-image-fal. Use for the cosmic-mythology-voiceover format.
What it loads into context
Frontmatter
231 tokensAlways available to the agent
SKILL.md
1,473 tokensWhen the skill is activated
Reference documents
3,436 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Contract (the free assembly)
Scripts executed separately
scripts/render.py
Files
SKILL.mdcore5,695 bytesSKILL.mdcore5,695 bytesscripts/PIPELINE.mddoc5,714 bytesscripts/README.mddoc4,693 bytesscripts/config.example.jsonasset9,915 bytesscripts/render.pyruns12,092 bytesskill.meta.jsonasset243 bytestests/smoke-test.mddoc1,736 bytes
Read SKILL.md
# render-cosmic-mythology-voiceover
Assemble a **cosmic-mythology-voiceover** reel from a config: a faceless, cinematic storytelling
video where one spoken **voiceover** carries the whole narrative over a slow, weighted **Ken-Burns
zoom** across curated stills in ONE locked look, with ONE on-screen hook line and burned captions.
The narrator, voice, tone, story shape, visual world and art style are the recipe's user choices —
this capability only assembles what it is given (the demo: a warm contemplative "the steady star, not the
brightest" reframe over deep-indigo + gold cosmic stills). This
capability is the **FREE, deterministic assembly** — the weighted beat-sync sequencing, the
Ken-Burns render, the concat, the VO composite, the hook overlay, and the caption burn.
`scripts/config.example.json` is the worked example — reference only, never the default
(Peerlark Optics "The North Star isn't the brightest", ~31s
1080×1920 9:16, 12 weighted Ken-Burns cuts); `scripts/PIPELINE.md` maps every config block to itsView the complete source on GitHubrender-creator-pip-listicle
When your agent uses it
Assemble a creator picture-in-picture product-listicle ad from a config. The creator stays full-frame for every beat (voice and lips generated together), and each product beat carries three overlays for the whole beat: a title pill, the product demo in a rounded picture-in-picture window (the brand's muted UGC clip, or its UI still or screen recording), and a product card with thumbnail, number, category and name. Hook and CTA beats show the creator with the title pill only. It builds one overlay image per beat, composites it on the creator clip, concatenates the beats and burns timed captions last. Free, deterministic assembly; the creator anchor and talking clips come from create-image-fal and create-video-fal. Use for the creator-pip-listicle format.
What it loads into context
Frontmatter
173 tokensAlways available to the agent
SKILL.md
2,135 tokensWhen the skill is activated
Reference documents
4,559 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Run
- Contract (the free assembly)
Files
SKILL.mdcore8,376 bytesSKILL.mdcore8,376 bytesscripts/PIPELINE.mddoc8,453 bytesscripts/README.mddoc5,906 bytesscripts/config.example.jsonasset12,478 bytesskill.meta.jsonasset182 bytestests/smoke-test.mddoc2,521 bytes
Read SKILL.md
# render-creator-pip-listicle
Assemble a **creator picture-in-picture product listicle** ad from a config: an AI creator counts
down N products in the brand's own voice, and **the creator stays FULL-FRAME the whole time — there
is NO cut to a full-frame product shot, ever.** On each product beat, three persistent overlays ride
on top of the full-frame creator for the WHOLE beat: (1) a **title pill** top-center (persistent, it
carries the listicle title), (2) the **DEMO** in a rounded **PiP window top-right** — the brand's
real UGC clip (MUTED), or for a no-UGC brand the product's own demo (a real screen-recording, or an
autocropped high-res product-UI/dashboard still sized to fill the window), and (3) a **product card**
pinned bottom (rounded thumbnail left + "N · CATEGORY" small-caps + product NAME in a serif face like
Georgia). Hook + CTA beats are the creator full-frame with the **title pill only** (no PiP/card). The
creator's voice + lips are generated **together, natively** per beat — there is no separate voiceover.
This capability is the **FREE, deterministic assembly** — build the per-beat overlay PNG, cover-scale
the creator clip + composite the overlay, concat all beats, and burn the captions.View the complete source on GitHubrender-editorial-motion-podcast
When your agent uses it
Assemble an editorial-motion podcast-clip ad from a config — a real clipped podcast MP3 carries the narrative while N flat limited-palette editorial-illustration keyframes (one look pack) are animated NOT by generative i2v but by DETERMINISTIC ffmpeg ken-burns (zoompan) + hard cuts (no crossfades, which expose geometric drift), each beat snapped to its spoken line, the real audio muxed, Whisper-driven captions burned only mid-sentence, and closed on a PIL brand end card — never AI-rendered text. This is the FREE deterministic assembly stage (ffmpeg ken-burns + hard concat + audio mux + captions + end card); the real audio is clipped from source and the keyframes come from create-image-fal. Use for the editorial-motion-podcast format.
What it loads into context
Frontmatter
182 tokensAlways available to the agent
SKILL.md
1,569 tokensWhen the skill is activated
Reference documents
3,405 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Run
- Contract (the free assembly)
Files
SKILL.mdcore6,163 bytesSKILL.mdcore6,163 bytesSKILL.mdcore6,163 bytesSKILL.mdcore6,163 bytesscripts/PIPELINE.mddoc6,734 bytesscripts/README.mddoc4,820 bytesscripts/config.example.jsonasset15,277 bytesskill.meta.jsonasset225 bytestests/smoke-test.mddoc1,084 bytes
Read SKILL.md
# render-editorial-motion-podcast
Assemble an **editorial-motion podcast-clip** ad from a config: a real clipped podcast audio
line carries the whole narrative and every visual beat is timed to the sentence it describes,
in ONE flat, strictly limited-palette editorial-illustration look pack ("a magazine
spot-illustration that moves" — the style and palette are the caller's choice). The motion is **not generative video** but deterministic ffmpeg ken-burns on static
keyframes, so it reads as a printed page that moves. This capability is that **FREE,
deterministic assembly** — the ffmpeg motion, hard-concat, audio mux, caption burn, and PIL
end card.
`scripts/config.example.json` is the worked example (the fictional Ironfern "The Trees With No Wind" demo, ~40.8s
1080×1920 9:16, 6 beats — its 2-tone Niemann look, cream/charcoal/sage palette and dome-tree
metaphor are that demo's picks, never defaults); `scripts/PIPELINE.md` maps every config block to its source step and
`scripts/README.md` documents the free assembly.View the complete source on GitHubrender-flat-vector-explainer
When your agent uses it
Assemble the FREE steps of the flat-vector-explainer video format — a flat-illustration host character (who, where, tone, voice and music come from the recipe choices) walks a countable N-step product routine, one step per beat, and Remotion composites every chip/numeral/tagline/slate/CTA as an animated DOM overlay ON TOP of the Kling i2v character clips (text is NEVER baked into a keyframe — i2v warps type), the closing 'N products' grid is a PIL composite of the REAL product photos (not AI), full-sentence VO drives word-by-word burned captions over a VO-forward music bed, and the ~50s animated silent master is re-cut to a 30s deliverable FROM the animated master (never a static intermediate). Documentation-grade — ships config.example.json + PIPELINE.md + a README of the free assembly; the paid gen steps (keyframes, Kling i2v, VO, music) are separate capabilities the recipe orchestrates. Use for the flat-vector-explainer format.
What it loads into context
Frontmatter
231 tokensAlways available to the agent
SKILL.md
1,538 tokensWhen the skill is activated
Reference documents
3,002 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- The two non-negotiable separations
- Free assembly steps (this capability)
- Paid gen steps (separate capabilities)
- Contract
Files
SKILL.mdcore6,369 bytesSKILL.mdcore6,369 bytesscripts/PIPELINE.mddoc4,460 bytesscripts/README.mddoc5,740 bytesscripts/config.example.jsonasset10,908 bytesskill.meta.jsonasset183 bytestests/smoke-test.mddoc1,261 bytes
Read SKILL.md
# render-flat-vector-explainer
Assembles a flat-vector product-routine explainer: one illustrated host character walks through a countable N-step routine (e.g. the demo's soil mix -> plant food -> leaf mist -> root tonic), one step per beat, each beat carrying a large corner numeral, a labelled chip + one-line tagline, and the step's real product photo, closing on an "N products" grid + brand CTA. It reads as a premium DTC explainer (Spotify/Anchor flat-vector lineage), not UGC.
This capability is **documentation-grade**. The format's source recipe is a documented recipe, not a runnable end-to-end app, so this capability ships the **config schema** (`scripts/config.example.json`), the **field-to-script map** (`scripts/PIPELINE.md`), and a **README** (`scripts/README.md`) describing the FREE assembly steps the agent runs by hand with ffmpeg + Remotion + PIL. The paid generative steps are separate capabilities the recipe orchestrates and gates.
## Choices
Creative calls the user makes (the recipe's `choices`, asked in one round before any paid step). The demo's value is only an example, never the default. The flat-vector 2D style itself is the format, not a choice.
- **`host`** — who the illustrated host is (gender, age, look, outfit) -> `character.anchor_prompt`. Asked; the demo used a mid-30s woman with a short black bob in green overalls.
- **`setting`** — where the routine happens -> the character keyframe prompts. Asked; the demo used a sunny windowsill full of houseplants.
- **`tone`** — the script's tone -> VO lines + expressions. Asked; the demo used faintly comedic overwhelm -> satisfied payoff.
- **`narrator_voice`** — the VO voice -> `voice.voice_id`. Asked; the demo used ElevenLabs "Eryn".View the complete source on GitHubrender-food-product-sizzle
When your agent uses it
Assemble a wordless macro-tabletop food-product sizzle ad from a config — normalize fps and SAR across ~4 photorealistic macro clips (hands tearing, flat lay, bite, box hero), concat them, apply a global anti-AI grain pass (eq plus hqdn3d plus noise), composite the audio (a non-diegetic instrumental music bed plus a couple of short diegetic SFX like a snap and a tear placed at measured cue points, loudnorm), composite a STATIC end card entirely in PIL (real logo PNG plus real product PNG plus a serif heritage headline plus a CTA — never AI-rendered text), and burn optional serif stat-callout pills at beats. This is the FREE deterministic assembly stage (normalized concat plus grain plus music and SFX mix plus PIL end card plus callouts); the macro keyframes, i2v clips, and music bed come from create-image-fal, create-video-fal, and create-music-elevenlabs. Use for the food-product-sizzle format.
What it loads into context
Frontmatter
224 tokensAlways available to the agent
SKILL.md
1,482 tokensWhen the skill is activated
Reference documents
2,893 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Run
- Contract (the free assembly)
Files
SKILL.mdcore5,779 bytesSKILL.mdcore5,779 bytesscripts/PIPELINE.mddoc5,370 bytesscripts/README.mddoc3,305 bytesscripts/config.example.jsonasset11,226 bytesskill.meta.jsonasset181 bytestests/smoke-test.mddoc1,608 bytes
Read SKILL.md
# render-food-product-sizzle
Assemble a **food-product sizzle** ad from a config: a wordless macro-tabletop photorealistic sizzle
for a physical food / CPG product — tactile tabletop photography in ONE look pack (setting + light
chosen per brand; the demo's is a warm tungsten pantry), ~4 dynamic macro scenes (hands tearing, a flat lay, a partial-face bite, a box / pack
hero) flowing into a static end card, carried by a non-diegetic instrumental music bed + a few diegetic
SFX with NO voiceover. This capability is the **FREE, deterministic assembly** — normalized concat,
the anti-AI grain pass, the audio (music bed + SFX) composite, the PIL end card, and the optional
serif stat-callout pills.
`scripts/config.example.json` is the worked example (Fernhollow Cacao "Dark Bar Sizzle", ~14s
1080×1920 9:16, ~4 macro scenes + a static end card); `scripts/PIPELINE.md` maps every config block
to its source step and `scripts/README.md` documents the free assembly.
View the complete source on GitHubrender-glassy-matte-grwm
When your agent uses it
Assemble a multi-scene GRWM beauty-demo ad from a config — a locked-identity creator applies ~5 products step by step while a SEPARATE ElevenLabs voiceover narrates and every scene cut is snapped to the VO's product-name word-starts (Whisper word-level timestamps), then ~5 Playwright product overlay cards (real PDP-verified taglines) are composited onto the master each on its product-NAME word-start, the SEPARATE VO is mixed on top of a ducked music bed at loudnorm I=-14, clean-white 3-words/cue captions are burned, and the video closes on a flat-lay end card. This is the FREE deterministic assembly stage (re-cut to the VO word-starts, hard-concat, Playwright card render + card composite, VO plus music mix, caption burn, flat-lay end card); the VO, scene clips, product cutouts, and music come from create-music-elevenlabs / create-image-gpt-image-fal / create-video-fal. Use for the glassy-matte-grwm format.
What it loads into context
Frontmatter
239 tokensAlways available to the agent
SKILL.md
1,710 tokensWhen the skill is activated
Reference documents
3,335 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Run
- Contract (the free assembly)
Files
SKILL.mdcore6,504 bytesSKILL.mdcore6,504 bytesscripts/PIPELINE.mddoc6,634 bytesscripts/README.mddoc3,419 bytesscripts/config.example.jsonasset13,157 bytesskill.meta.jsonasset179 bytestests/smoke-test.mddoc1,505 bytes
Read SKILL.md
# render-glassy-matte-grwm
Assemble a **multi-scene GRWM beauty-demo** ad from a config — a locked-identity creator applies
~5 makeup/skincare products step by step in a chosen setting, a **separate** ElevenLabs voiceover
narrates the routine, and every scene cut is snapped to the VO's product-name word-starts, with
~5 Playwright product overlay cards on the product-name beats, a ducked music bed, burned
captions, and a flat-lay end card. This capability is the **FREE, deterministic assembly** —
the Whisper-driven re-cut + hard-concat, the Playwright card render + card composite, the VO +
music mix, the caption burn, and the flat-lay end card.
This is the **multi-scene beauty demo**, distinct from the single-take apparel outfit-reveal
(`ugc-grwm`, one Seedance reference-to-video call with native lip-sync and minimal post). Here the
timeline is driven by a SEPARATE VO and the scenes are re-cut to its word-starts.
View the complete source on GitHubrender-hand-swipe-flavor-listicle
When your agent uses it
Render a 'hand-swipe flavor listicle' video from a config — the brand's REAL product cutouts each float on a flat flavor-matched color field under a persistent title and slide RIGHT-TO-LEFT one to the next like a phone-feed scroll, while a green-screen hand clip (back of hand toward camera, index finger up) is trimmed to its clean finger-up window, looped once per flavor, keyed with a green-dominance alpha key, scaled down and anchored at the bottom, with an optional end card and an optional instrumental music bed — deterministic PIL plus FFmpeg assembly, FREE (the hand clip comes from create-video-fal and the bed from create-music-elevenlabs), so labels stay pixel-crisp. Use for the hand-swipe-flavor-listicle format.
What it loads into context
Frontmatter
179 tokensAlways available to the agent
SKILL.md
3,108 tokensWhen the skill is activated
Reference documents
1,180 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Getting the inputs
- Config
- Choices
- Making the hand clip (paid, gated — not this capability)
- Making the music bed (paid, gated — not this capability)
- Craft rules (baked into the renderer)
- Output
Scripts executed separately
scripts/build_hand_swipe_listicle.pytests/make_smoke_inputs.py
Files
SKILL.mdcore11,678 bytesSKILL.mdcore11,678 bytesSKILL.mdcore11,678 bytesSKILL.mdcore11,678 bytesSKILL.mdcore11,678 bytesSKILL.mdcore11,678 bytesSKILL.mdcore11,678 bytesSKILL.mdcore11,678 bytesSKILL.mdcore11,678 bytesscripts/build_hand_swipe_listicle.pyruns19,943 bytesscripts/config.example.jsonasset1,489 bytesskill.meta.jsonasset243 bytestests/make_smoke_inputs.pyruns3,863 bytestests/smoke-test.mddoc3,673 bytes
Read SKILL.md
# render-hand-swipe-flavor-listicle
Render the **hand-swipe-flavor-listicle** format from a config: a short vertical
(1080×1920, 30fps, ~7.5s) "N flavors of <Brand>" listicle. Each flavor is a card — a flat,
saturated color field + a persistent title + the brand's REAL product cutout with a soft
contact shadow. Cards change by sliding **right-to-left** (a phone-feed scroll), while a
real-looking hand sweeps at the bottom of the frame. Music-only, no VO.
This capability is the **FREE, deterministic assembly** (no paid calls, no keys). It never generates
or edits the product — the cutouts are composited as-is, so labels stay crisp. It needs
four kinds of input, gathered first (see **Getting the inputs**): product cutouts, a title
TTF, a green-screen hand clip, and (optionally) a music bed.
## RunView the complete source on GitHubrender-hook-replacement
When your agent uses it
Replace an existing video's opening with a supplied clip or free kinetic text hook while retaining and verifying every original body frame, audio, captions and ending. Use for surgical hook tests rather than regenerating the complete ad.
What it loads into context
Frontmatter
64 tokensAlways available to the agent
SKILL.md
1,945 tokensWhen the skill is activated
Reference documents
1,162 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Purpose
- Inputs
- Workflow
- Free demonstration
- Output
- Quality Checks
- Failure Modes
- Related
Scripts executed separately
scripts/make_demo.pyscripts/replace_hook.pyscripts/replace_pack.pytests/test_replace_hook.py
Files
SKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesSKILL.mdcore8,929 bytesconfig.example.jsonasset254 bytesreferences/hook-replacement.mddoc5,044 bytesscripts/make_demo.pyruns2,987 bytesscripts/replace_hook.pyruns29,132 bytesscripts/replace_pack.pyruns3,649 bytesskill.meta.jsonasset274 bytestests/smoke-test.mddoc571 bytestests/test_replace_hook.pyruns12,216 bytes
Read SKILL.md
# Human version
Replace only the opening of a selected video. The rest comes from the original,
including its ending and burned captions. A supplied hook uses free local assembly;
short text can become a free animated card. Generated footage or voice is optional
and requires a separate estimate and approval.
The output is a complete MP4 and an edit manifest identifying the exact original,
cut, duration change and preservation checks. It stays **needs review** until the
finished video has been watched and its sound checked.
---
# Agent versionView the complete source on GitHubrender-hypermotion
When your agent uses it
Assemble the FREE steps of the product-hypermotion + kinetic-typography video format — dice ONE Seedance 2.0 hypermotion clip into 5-6 segments and intercut them with PIL kinetic-typography spec/CTA cards (italic skew, 1.08x outline echo, 3D extrusion, slam-with-shake, inversion flash) plus a real-logo PIL end card (base64-decoded from the brand SVG), center-crop 1:1 to 9:16, and explicit-map mux a music bed. Deterministic, FREE (PIL + FFmpeg), no paid calls, the real logo and spec typography stay pixel-crisp. The paid steps (the ONE Seedance i2v, the music) are separate capabilities; the recipe orchestrates them. Use for the product-hypermotion format.
What it loads into context
Frontmatter
188 tokensAlways available to the agent
SKILL.md
1,575 tokensWhen the skill is activated
Reference documents
4,815 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- The FREE assembly
- Run
- Contract
Files
SKILL.mdcore5,814 bytesscripts/PIPELINE.mddoc10,012 bytesscripts/README.mddoc5,284 bytesscripts/config.example.jsonasset6,686 bytesskill.meta.jsonasset173 bytestests/smoke-test.mddoc1,297 bytes
Read SKILL.md
# render-hypermotion
Assembles a product-hypermotion + kinetic-typography ad: a vertical 9:16 sizzle (~20–30s)
where ONE spectacular AI-gen hypermotion clip of the hero product carries the energy and
punchy PIL-rendered spec cards carry the facts. Music-led, no VO — it reads as a
high-production sizzle, not UGC.
The reusable IP is **one-call-many-cuts + intercut**: dice ONE 12–15s Seedance 2.0
hypermotion i2v into 5–6 segments (never a paid call per segment) and interleave PIL
kinetic-typography spec cards between the cuts, capped by a real-logo end card, over a
beat-driven music bed.
This capability ships the FREE, deterministic assembly — everything between the two paid
model calls. It is **documentation-grade + config**: the format has no runnable driver.View the complete source on GitHubrender-ig-live-gallery
When your agent uses it
Render an 'Instagram-Live social-proof gallery' video from a config — ~5 real brand product stills each framed as an Instagram-LIVE card (IG gradient-ring avatar, username, verified check, red LIVE badge, viewer count, close X, a short claim-free live-comment feed, an empty 'Add a comment…' bar, and reaction hearts floating up the right edge), with a brand-approved benefit sentence building one phrase per slide and a clean logo endcard, rendered deterministically with PIL frames plus FFmpeg — FREE (the music bed comes from create-music-elevenlabs), products and wordmark stay crisp. Use for the ig-live-gallery format.
What it loads into context
Frontmatter
148 tokensAlways available to the agent
SKILL.md
994 tokensWhen the skill is activated
Reference documents
433 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Choices
- Craft rules (baked into the renderer)
- Output
Scripts executed separately
scripts/build.py
Files
SKILL.mdcore4,088 bytesSKILL.mdcore4,088 bytesscripts/build.pyruns16,131 bytesscripts/config.example.jsonasset2,199 bytesskill.meta.jsonasset217 bytestests/smoke-test.mddoc1,543 bytes
Read SKILL.md
# render-ig-live-gallery
Render the **ig-live-gallery** format from a config. Each of the brand's REAL hero product
stills is presented as the "live video" inside an authentic Instagram-Live card — dark
gradient scrims top & bottom over the bright product, an IG gradient-ring avatar + username +
verified check + red LIVE badge + viewer count + close X across the top, a short live-comment
feed + an EMPTY "Add a comment…" bar + heart/share icons across the bottom, and pink/red
reaction hearts floating up the right edge. A benefit sentence builds one short phrase per
slide as the top overlay, and it closes on a clean brand logo card with the payoff line + CTA.
Deterministic and FREE — no generative image/video, no AI-rendered text. The paid music bed is
a separate capability (`create-music-elevenlabs`) muxed on afterward.
## RunView the complete source on GitHubrender-imessage-chat
When your agent uses it
Render a configurable iMessage conversation inside a properly framed phone, then a brand end card. Uses the original send/receive sounds and a shared frame timeline for text, typing, scrolling and sound. Free local Playwright + ffmpeg assembly; optional image/music generation belongs to separate gated capabilities.
What it loads into context
Frontmatter
94 tokensAlways available to the agent
SKILL.md
2,932 tokensWhen the skill is activated
Reference documents
1,512 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices and bindings
- Run
- Config contract
- Original sound contract
- Verification and failures
- Critical knowledge
Scripts executed separately
scripts/chat-driver.jsscripts/check-render.pyscripts/mockup/generate.jsscripts/mockup/templates/icons.jsscripts/package.jsonscripts/record-chat.jsscripts/render-end-card.jsscripts/render.shscripts/stitch.shtests/test_chat.jstests/test_safe_area.jstests/test_stitch.py
Files
SKILL.mdcore13,100 bytesSKILL.mdcore13,100 bytesSKILL.mdcore13,100 bytesSKILL.mdcore13,100 bytesSKILL.mdcore13,100 bytesassets/sfx/imessage-receive.mp3asset11,812 bytesassets/sfx/imessage-send.mp3asset4,324 bytesreferences/imessage-reference.mddoc5,373 bytesscripts/chat-driver.jsruns6,473 bytesscripts/check-render.pyruns6,245 bytesscripts/config.example.jsonasset1,756 bytesscripts/end-card.template.htmlasset3,593 bytesscripts/mockup/generate.jsruns16,294 bytesscripts/mockup/templates/chat.cssasset18,495 bytesscripts/mockup/templates/icons.jsruns3,386 bytesscripts/package-lock.jsonasset1,690 bytesscripts/package.jsonruns322 bytesscripts/record-chat.jsruns25,651 bytesscripts/render-end-card.jsruns14,598 bytesscripts/render.shruns992 bytesscripts/sfx-embedded.jsonasset22,194 bytesscripts/stitch.shruns9,142 bytesskill.meta.jsonasset230 bytestests/fixtures/long-group-thread.jsonasset3,391 bytestests/smoke-test.mddoc1,510 bytestests/test_chat.jsruns12,559 bytestests/test_safe_area.jsruns10,308 bytestests/test_stitch.pyruns13,240 bytes
Read SKILL.md
> **Superseded:** the video kit now does this with the phone-chat part, version 1.2.0, in the parts folder of this repository. Every phone-chat style is a style file that draws the same screen frame by frame from the plan's scenes, with the original sounds, in the kit's browser. This atom stays, unchanged in behaviour, for skills outside the kit until they move; its scripts still run.
# Human version
Make a texting-story ad with the chosen contact names and phone time, a
proportional phone, an inset Dynamic Island and the original iMessage sounds.
The brand, story and background can change. Images are optional and can appear
anywhere in the conversation; product links and music are optional too.
This rebuild preserves the shell and sounds from the approved Dermwise Goa
build. It fixes missing identity binding, the island touching the screen edge,
light-mode header colors, early/missing group names and capture timing drift.
Every movie frame and sound cue uses the same timeline; browser startup cannot
trim the beginning or ending. No paid API is needed to render or repair the UI.View the complete source on GitHubrender-ios-keyboard
When your agent uses it
Render a static iOS QWERTY keyboard as inline HTML+CSS sized for the 750-wide 9:16 stage. Includes the 3-suggestion bar, alpha keys, shift/backspace, 123/emoji/space/return row, and the bottom globe+mic strip. No animation logic — slide up/down is the molecule's job (CSS transform on the .keyboard root).
What it loads into context
Frontmatter
108 tokensAlways available to the agent
SKILL.md
1,998 tokensWhen the skill is activated
Reference documents
2,351 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Purpose
- Inputs
- Workflow
- CLI (for local visual testing)
- Output
- Files
- Quality checks
- Known limitations
- Quality Checks
- Failure Modes
Scripts executed separately
generate.jsrender.js
Files
SKILL.mdcore7,807 bytesSKILL.mdcore7,807 bytesgenerate.jsruns4,399 bytesrender.jsruns1,536 bytesskill.meta.jsonasset134 bytestemplates/keyboard.cssasset2,800 bytestests/expected-output.mddoc3,016 bytestests/human-test.mddoc1,701 bytestests/sample-input.mddoc1,619 bytestests/smoke-test.mddoc2,111 bytes
Read SKILL.md
> **Superseded:** the video kit now does this with the phone-chat part, version 1.2.0, in the parts folder of this repository. Every phone-chat style is a style file that draws the same screen frame by frame from the plan's scenes, with the original sounds, in the kit's browser. This atom stays, unchanged in behaviour, for skills outside the kit until they move; its scripts still run.
# render-ios-keyboard
## Purpose
Provide a drop-in iOS QWERTY keyboard fragment that pairs with messaging atoms (create-chatgpt-mockup, create-imessage-mockup) when a video needs to show someone typing. Static only: the keyboard sits at the bottom of the screen, the molecule's recorder slides it up/down with `transform: translateY(...)`.
## Inputs
```js
const { renderKeyboardHTML, renderKeyboardCSS } = require('./generate');
const html = renderKeyboardHTML({
suggestions: ['"He"', 'Hey', 'Heating'], // optional, default ['I', 'The', "I'm"]View the complete source on GitHubrender-logo-equation-card
When your agent uses it
Render the logo-equation card ad (7s, 9:16) — partner icon + brand icon joined by a plus sign as an equation, a two-line "= outcome" headline, four numbered steps, and a CTA that hard-cuts in at 2s, on a static black card over timelapse b-roll, no voice. render_card.py draws the two card plates with measured geometry and hard guardrails (the user must confirm the integration is real, no partnership/endorsement/ranking words, no comment-bait CTA, no dashes); compose.py lays the card over the b-roll sped up to read as a timelapse, with an optional bed; measure_motion.py gates the b-roll (a real-time shot reads as a photo). Free, local.
What it loads into context
Frontmatter
209 tokensAlways available to the agent
SKILL.md
1,361 tokensWhen the skill is activated
Reference documents
176 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Choices
- Guardrails (enforced by render_card.py)
- Rules for the b-roll
- Audio
Scripts executed separately
scripts/_fonts.pyscripts/compose.pyscripts/measure_motion.pyscripts/render_card.py
Files
SKILL.mdcore5,230 bytesSKILL.mdcore5,230 bytesSKILL.mdcore5,230 bytesSKILL.mdcore5,230 bytesscripts/_fonts.pyruns1,812 bytesscripts/compose.pyruns3,716 bytesscripts/measure_motion.pyruns3,318 bytesscripts/render_card.pyruns11,539 bytesskill.meta.jsonasset210 bytestests/smoke-test.mddoc522 bytes
Read SKILL.md
> **Superseded:** the video kit now does this with goose-studio's logo-equation-card style, which uses the html-frames part, version 1.2.1 (the card), the cut-footage part, version 1.2.1 (the timelapse b-roll) and the audio-mix part, version 1.1.0 (the optional bed), in the parts folder of this repository. This renderer stays, unchanged in behaviour, for goose-studio's create-logo-equation-card-video-ad molecule until it moves; its scripts still run.
# render-logo-equation-card
A card-led format: everything the viewer reads is on a static black card in the top third;
under it, b-roll moves like a timelapse to stop the scroll. One animated event: the CTA line
hard-cuts in at 2.0s. No voice, no captions, no cuts.
## Run
```bash
python render_card.py card.json --out-dir work/ # card-no-cta.png, card-with-cta.png
python compose.py --broll broll.mp4 --cards work/ --out ad.mp4 --in 3 --speed 4 [--bed bed.mp3]
python measure_motion.py ad.mp4 --cta-at 2.0 # exit 1 = rejectView the complete source on GitHubrender-model-comparison-grid
When your agent uses it
Render a 'model comparison grid' video from a config — a fal-style "same prompt, N contenders" showcase — a dark real-DOM stage where per beat a monospace prompt fades in centered, docks to a small top strip, then a labeled 2-4 panel grid (static images OR muted video clips, mixable per cell) staggers in and holds for comparison, plus a minimal end card — frame-stepped via Playwright (video cells are frame-seeked deterministically) and encoded with FFmpeg. Deterministic assembly, FREE (cell media comes from create-image-fal / create-video-fal, music from create-music-elevenlabs), text stays pixel-crisp. Use for the model-comparison-grid format.
What it loads into context
Frontmatter
165 tokensAlways available to the agent
SKILL.md
925 tokensWhen the skill is activated
Reference documents
249 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Contract
Scripts executed separately
scripts/build_composition.pyscripts/render_seekable_hyperframe.py
Files
SKILL.mdcore3,754 bytesscripts/build_composition.pyruns10,504 bytesscripts/config.example.jsonasset4,115 bytesscripts/render_seekable_hyperframe.pyruns2,586 bytesskill.meta.jsonasset223 bytestests/smoke-test.mddoc1,072 bytes
Read SKILL.md
# render-model-comparison-grid
Render the 'model comparison grid' format from a config. The signature of this format is a
**"Same prompt. N models."** gauntlet: a dark stage where, per beat, a `PROMPT` eyebrow +
the (condensed) prompt **fades in** centered in monospace and holds readable ~0.8s, then
docks to a small top strip while a **grid of 2-4 labeled panels** staggers in (0.15s apart)
and holds for side-by-side comparison. A persistent model/variant label sits under each
panel; column order is identical on every beat. Ends on a minimal end card (headline +
column names only — **no meta-stats line**).
The grid is **media-agnostic per cell**: any cell is a static image or a **muted video
clip** (i2v outputs, screen recordings), mixable within one beat. Video cells loop during
the hold and are **frame-seeked deterministically** (the renderer awaits each seek), so the
render never depends on wall-clock playback timing.View the complete source on GitHubrender-mosaic-grid-reveal
When your agent uses it
Render a 'mosaic-grid-reveal' video from a config — a real-DOM FULL-BLEED N×N mosaic of real product tiles that pops in one tile at a time (scatter order, ease-out-back overshoot), the grid clears, then the brand wordmark builds line-by-line followed by a sub-label, tagline, and CTA; frame-stepped via Playwright and encoded with FFmpeg — deterministic assembly, FREE (the music bed comes from create-music-elevenlabs), so the wordmark, tile captions, and CTA stay pixel-crisp. Use for the mosaic-grid-reveal format.
What it loads into context
Frontmatter
139 tokensAlways available to the agent
SKILL.md
1,241 tokensWhen the skill is activated
Reference documents
355 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Inputs (`config.json`)
- Choices
- Run
- Rules
Scripts executed separately
scripts/_shared.jsscripts/build_html.pyscripts/render.py
Files
SKILL.mdcore4,625 bytesSKILL.mdcore4,625 bytesscripts/_shared.jsruns950 bytesscripts/build_html.pyruns8,996 bytesscripts/config.example.jsonasset2,840 bytesscripts/render.pyruns2,601 bytesskill.meta.jsonasset220 bytestests/smoke-test.mddoc1,361 bytes
Read SKILL.md
# render-mosaic-grid-reveal
Render the `mosaic-grid-reveal` format from a config. The signature of this format is a
**full-bleed N×N mosaic** (default 3×3) of the brand's real product stills that **pops in
one tile at a time** (scatter order, ease-out-back "pop"), building the whole grid; the grid
then **clears** (scale-up + fade) and a clean end card **builds line-by-line** — the brand's
real wordmark, then a small sub-label, then the tagline, then a CTA. Silent by design (a
light music bed is muxed separately via `create-music-elevenlabs`). The hook is RANGE — nine
maximally-distinct variants show how much choice the brand offers.
Everything is a real-DOM HTML scene **frame-stepped** to PNG via Playwright and encoded with
FFmpeg, so the wordmark, tile captions, and CTA stay **pixel-crisp** (a video model would
smear them). No generative video, no i2v, no AI-rendered text. This capability is **FREE and
deterministic** — the only paid step of the format (the music bed) is a separate media cap.View the complete source on GitHubrender-multiworld
When your agent uses it
Assemble a silent, music-led 3-world product-tour ad — trim and hard-cut-concat the per-world WIDE-arrival + top-down-macro clips, composite the HTML/Playwright brand end card (approved headline + handwritten product labels + arrows) over an AI flat-lay background, and mux one music bed into a 720x1280 web master. FREE, deterministic assembly (Playwright + PIL/HTML + FFmpeg); the recipe supplies the config and gates the paid clip/background/music calls. Use for the multiworld-product-tour format.
What it loads into context
Frontmatter
125 tokensAlways available to the agent
SKILL.md
1,542 tokensWhen the skill is activated
Reference documents
3,886 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Run
- Contract
- Gaps / routing notes
Files
SKILL.mdcore6,106 bytesSKILL.mdcore6,106 bytesscripts/PIPELINE.mddoc7,369 bytesscripts/README.mddoc5,924 bytesscripts/config.example.jsonasset12,019 bytesskill.meta.jsonasset172 bytestests/smoke-test.mddoc1,266 bytes
Read SKILL.md
# render-multiworld
Assemble a silent, music-led "multi-world product tour" ad (≈27s, 9:16) — a tour of three
distinct "third-place" worlds (chosen per video), one per product/variant, that lands on a Pinterest-style brand
end card. Each world is a **two-shot pair**: a ~4.5s WIDE kinetic-calm ARRIVAL (the
environment dominates, the product stays small) hard-cutting to a ~3.5s top-down MACRO
product MOMENT (the sealed product nested with its companion prop). Variant identity is
carried by the **world + companion prop**, not by product color. No VO, no captions in
the scenes — one music bed carries the whole thing.
This capability is the **FREE, deterministic assembler**. The paid steps — the six
per-world clips, the AI flat-lay end-card background, the ElevenLabs music bed — are
separate capabilities (see the gap below for the clips); the recipe orchestrates and gates
them.View the complete source on GitHubrender-myth-vs-fact
When your agent uses it
Assemble a myth-vs-fact kinetic-typography explainer video ad (≈29.5s, 9:16) from N myth/fact pairs + hook / turn / punch copy + palette + a brand end-card PNG + a VO track — a hook, 3 red-strike MYTH cards that flip to teal-check FACT cards (per-line strikethrough that crosses EVERY wrapped line), a "what actually works" turn, an optional proof reveal, a punch line, and a static end card. DETERMINISTIC assembly with ZERO AI-gen visuals — HTML hyperframes rendered frame-exact via Playwright (`window.renderAt(t)`, animation a pure function of beat-local time), Whisper beat-snap to VO word onsets, concat at a uniform fps, karaoke `.ass` captions burned last (suppressed on the proof + end-card beats), and a VO + optional music mix (music −20 dB, `amix normalize=0`, tail fade). FREE (Python + Playwright + ffmpeg); the recipe supplies the copy / palette / end-card / VO and gates the paid VO / music / Whisper calls to their own capabilities. Use for the myth-vs-fact format.
What it loads into context
Frontmatter
264 tokensAlways available to the agent
SKILL.md
2,375 tokensWhen the skill is activated
Reference documents
1,628 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The 8-beat spine (roles)
- Scripts (free — Python + Playwright + ffmpeg, no paid calls)
- Inputs (all via `--config` + a runtime work dir — NO hardcoded paths)
- Choices
- Craft rules (load-bearing — faithful to the source molecule)
- Requires
Scripts executed separately
scripts/beat_snap.pyscripts/compose.pyscripts/hyperframes/_shared.jsscripts/make_captions.pyscripts/media_proxy.pyscripts/render_beats.py
Files
SKILL.mdcore8,827 bytesSKILL.mdcore8,827 bytesscripts/beat_snap.pyruns5,567 bytesscripts/compose.pyruns6,908 bytesscripts/config.example.jsonasset4,369 bytesscripts/hyperframes/_shared.cssasset6,889 bytesscripts/hyperframes/_shared.jsruns7,931 bytesscripts/hyperframes/beat-hook.htmlasset3,312 bytesscripts/hyperframes/beat-myth-fact.htmlasset4,169 bytesscripts/hyperframes/beat-proof.htmlasset2,979 bytesscripts/hyperframes/beat-punch.htmlasset1,246 bytesscripts/hyperframes/beat-turn.htmlasset1,963 bytesscripts/make_captions.pyruns4,712 bytesscripts/media_proxy.pyruns58,192 bytesscripts/render_beats.pyruns7,421 bytesskill.meta.jsonasset229 bytestests/smoke-test.mddoc5,667 bytes
Read SKILL.md
# render-myth-vs-fact
The free, deterministic renderer for the **myth-vs-fact** video ad format — the
sound-off-safe kinetic-typography explainer that busts N common myths and hands the viewer
a credible resolution. Red-strike **MYTH** cards flip to teal-check **FACT** cards over a
VO (voice + tone are the caller's choice; the demo used a calm-authority expert), then a "what actually works" **turn** + an optional **proof reveal** + a
**punch** line + a static brand **end card**.
Every on-screen word is a **deterministic HTML hyperframe** — **no AI image/video gen, no
b-roll, no character**. Visuals are **free** (no paid calls). The only metered spend is upstream (VO +
Whisper word-timestamps + an optional music bed), gated to its own capabilities. This
capability OWNS the whole FREE assembly: beat-snap → render → captions → mix → burn →
master. Iterate the cut for free; re-roll only the offending paid audio beat.
View the complete source on GitHubrender-narrated-ugc-wardrobe-stitch
When your agent uses it
Assemble a narrated-UGC "stitch reply" ad from a config: one voiceover carries a verbatim testimonial while about 30 short clips (one creator across about 5 outfits and 3 settings, plus product B-roll) are trimmed to windows cut from the voiceover's word timings and joined. The voiceover sits over a ducked music bed, word-by-word captions run throughout, a landing-page scroll is animated from a screenshot, and the brand's real end card closes it (never AI-rendered text). Free, deterministic assembly using the shared stitch-videos-ffmpeg helper; the voiceover, creator stills and clips come from create-vo-elevenlabs, create-image-gpt-image-fal, create-image-fal and create-video-fal. Use for the narrated-ugc-wardrobe-stitch format.
What it loads into context
Frontmatter
202 tokensAlways available to the agent
SKILL.md
1,799 tokensWhen the skill is activated
Reference documents
5,155 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Run
- Contract (the free assembly)
Files
SKILL.mdcore6,780 bytesSKILL.mdcore6,780 bytesSKILL.mdcore6,780 bytesSKILL.mdcore6,780 bytesSKILL.mdcore6,780 bytesscripts/PIPELINE.mddoc6,958 bytesscripts/README.mddoc8,999 bytesscripts/config.example.jsonasset12,621 bytesskill.meta.jsonasset257 bytestests/smoke-test.mddoc2,316 bytes
Read SKILL.md
# render-narrated-ugc-wardrobe-stitch
Assemble a **narrated-UGC "stitch reply"** ad from a config: a fast-cut vertical testimonial
where a single spoken VO carries a verbatim ~13-sentence testimonial over ONE creator
across ~5 wardrobe changes in ~3 micro-worlds, interspersed with product B-roll (e.g. product macro,
unboxing, a landing-page scroll), ~30 hard cuts on the VO cadence, closing on a brand end card.
This capability is the **FREE, deterministic assembly** — trim-to-EDL, hard-concat, the VO+music
mix, the word-by-word caption burn, the landing-page zoompan, and the end-card append.
`scripts/config.example.json` is one worked example (the fictional Sunnook "Don't buy Sunnook Tan Mousse" demo, ~37s
1080×1920 9:16, ~30 body cuts + a ~2s end card) — its creator, voice, hook, worlds and music are
that demo's answers, not defaults; `scripts/PIPELINE.md` maps every config block to
its source step and `scripts/README.md` documents the free assembly.
View the complete source on GitHubrender-offer-ad
When your agent uses it
Render a punchy ~12s vertical (9:16) music-only direct-response OFFER ad as a 4-beat kinetic-typography film — HEADLINE slam → real PRODUCT drop → CLAIM/proof → CTA pill — from one config of copy slots, a real product photo, a brand palette, fonts, bpm, and beat split. DETERMINISTIC + FREE (a bundled Remotion project; springs + interpolate, no AI-gen for visuals). Backgrounds are engine gradient divs off the palette, props are inline SVG, the ONLY composited bitmap is the REAL product photo (objectFit:contain, never stretched), and ALL headline/claim/CTA/URL/wordmark text is typeset in the engine — never AI-rendered (the format's credibility guard). A driver binds the config to Remotion input props, renders the 9:16 master, and derives a 1:1 center-crop with ffmpeg. Two gating checks run before render (claim verbs must match the product's physical format; the claim beat needs an edge-entry mechanism prop). Use for the motion-graphics-offer-ad format.
What it loads into context
Frontmatter
242 tokensAlways available to the agent
SKILL.md
2,709 tokensWhen the skill is activated
Reference documents
1,353 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- The 4 beats (the spine)
- Two gating checks (run before any render — from the recipe)
- Run
- Scripts
- Config → props mapping (what binds to what)
- Craft rules (load-bearing — faithful to the first build)
- Requires
Scripts executed separately
project/package.jsonproject/remotion.config.tsproject/src/Main.tsxproject/src/Root.tsxproject/src/fonts.tsproject/src/index.tsproject/src/lib/anim.tsproject/src/props.tsproject/src/scenes/Scene01.tsxproject/src/scenes/Scene02.tsxproject/src/scenes/Scene03.tsxproject/src/scenes/Scene04.tsxscripts/render.py
Files
SKILL.mdcore9,925 bytesSKILL.mdcore9,925 bytesSKILL.mdcore9,925 bytesproject/.gitignoreasset143 bytesproject/package.jsonruns503 bytesproject/public/.gitkeepasset0 bytesproject/remotion.config.tsruns116 bytesproject/src/Main.tsxruns1,502 bytesproject/src/Root.tsxruns1,029 bytesproject/src/fonts.tsruns1,479 bytesproject/src/index.tsruns108 bytesproject/src/lib/anim.tsruns4,957 bytesproject/src/props.tsruns4,294 bytesproject/src/scenes/Scene01.tsxruns5,121 bytesproject/src/scenes/Scene02.tsxruns5,055 bytesproject/src/scenes/Scene03.tsxruns6,648 bytesproject/src/scenes/Scene04.tsxruns3,609 bytesproject/tsconfig.jsonasset293 bytesscripts/config.example.jsonasset2,717 bytesscripts/render.pyruns12,095 bytesskill.meta.jsonasset210 bytestests/smoke-test.mddoc4,961 bytes
Read SKILL.md
# render-offer-ad
The free, deterministic renderer for the **motion-graphics-offer-ad** format — the
punchy ~12s vertical, music-only, direct-response offer ad built as a **4-beat kinetic
-typography film**: a HEADLINE slams in word-by-word → the real PRODUCT drops in →
the CLAIM/proof lands → a CTA pill resolves. No character, no VO, no captions — the
on-screen **typeset** text IS the message.
This is a bundled **Remotion project** (`project/`) driven by a thin Python driver. The
shipping master is **100% engine-rendered** (springs + `interpolate`): backgrounds are
gradient divs off the `brand_palette`, props are inline SVG, and the ONLY composited
bitmap is the REAL product photo (`objectFit:contain`, **never stretched**). ALL
headline/claim/CTA/URL/wordmark text is typeset in the engine — **never AI-rendered**;
that is the format's credibility guard. Rendering is **free** (no paid calls); the only paid step is anView the complete source on GitHubrender-podcast-skit
When your agent uses it
Render a two-host podcast ad from a brand config and dialogue script. Includes the working planner, full-frame and split-screen assembly, captions from measured character timings, brand end card, approved paid-step adapters, and 65 quality-check falsification cases. Use for short conversational ads with two stable hosts in one room.
What it loads into context
Frontmatter
86 tokensAlways available to the agent
SKILL.md
699 tokensWhen the skill is activated
Reference documents
1,306 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Inputs and prerequisites
- Workflow
- Non-negotiables
- Related
Scripts executed separately
scripts/build_overlays.pyscripts/check_framing_render.pyscripts/compose_master.pyscripts/config_io.pyscripts/cost_model.pyscripts/crop_singles.pyscripts/gates.pyscripts/gen_paid.pyscripts/grade_episode.pyscripts/make_lockup.pyscripts/one_shot.pyscripts/pick_voices.pyscripts/plan_beats.pyscripts/plan_cuts.pyscripts/preview_framing.pyscripts/provider_commands.pyscripts/selftest.pyscripts/shape_vo.pyscripts/test_distribution.py
Files
SKILL.mdcore3,375 bytesrecipe.jsonasset25,793 bytesscripts/PIPELINE.mddoc102 bytesscripts/README.mddoc4,219 bytesscripts/arcs.jsonasset9,286 bytesscripts/build_overlays.pyruns15,687 bytesscripts/check_framing_render.pyruns10,428 bytesscripts/compose_master.pyruns29,597 bytesscripts/config.example.jsonasset27,544 bytesscripts/config_io.pyruns3,083 bytesscripts/cost_model.pyruns11,221 bytesscripts/crop_singles.pyruns5,482 bytesscripts/gates.pyruns68,722 bytesscripts/gen_paid.pyruns25,461 bytesscripts/grade_episode.pyruns13,909 bytesscripts/make_lockup.pyruns3,189 bytesscripts/one_shot.pyruns3,086 bytesscripts/pick_voices.pyruns7,552 bytesscripts/plan_beats.pyruns7,637 bytesscripts/plan_cuts.pyruns23,737 bytesscripts/preview_framing.pyruns4,387 bytesscripts/provider_commands.pyruns4,256 bytesscripts/script.example.jsonasset2,190 bytesscripts/selftest.pyruns33,424 bytesscripts/shape_vo.pyruns7,079 bytesscripts/test_distribution.pyruns6,714 bytesskill.meta.jsonasset511 bytessource-manifest.jsonasset2,462 bytestests/smoke-test.mddoc1,634 bytes
Read SKILL.md
# Human version
This package contains the working two-host podcast pipeline, examples and
quality checks. It plans and renders the edit for free. Voice, image and
lip-sync generation use the separately installed provider capabilities.
---
# Agent version
## Inputs and prerequisites
Read the bundled scripts README first. All relative paths in that guide refer
to this installed skill folder. Keep the brand config, dialogue script andView the complete source on GitHubrender-proof-points-overlay
When your agent uses it
Build the deterministic PIL pill overlays for a 'perfect-score + proof-points' UGC video ad (white 10/10 score header with a medal + orange sub with a finger-down + 3-4 green-check proof pills) and composite them onto a base clip in a diagonal L->R->L->R cascade, then mux the music bed into master-final.mp4. Config-driven (config.json), 1080x1920 9:16, FREE and deterministic (no paid calls, text stays pixel-crisp). Use for the overlay-proof-points format; the base clip + music come from separate paid capabilities.
What it loads into context
Frontmatter
142 tokensAlways available to the agent
SKILL.md
1,231 tokensWhen the skill is activated
Reference documents
428 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Scripts
- Contract
- Choices
- Music coverage
- Local layout checks
Scripts executed separately
scripts/build_overlays.pyscripts/compose_master.pyscripts/fetch_icons.pyscripts/music_coverage.pytests/test_layout.pytests/test_music.py
Files
SKILL.mdcore5,272 bytesSKILL.mdcore5,272 bytesreferences/music.mddoc1,267 bytesscripts/build_overlays.pyruns9,456 bytesscripts/compose_master.pyruns5,511 bytesscripts/fetch_icons.pyruns1,066 bytesscripts/music_coverage.pyruns4,595 bytesskill.meta.jsonasset237 bytestests/smoke-test.mddoc697 bytestests/test_layout.pyruns3,303 bytestests/test_music.pyruns7,543 bytes
Read SKILL.md
# render-proof-points-overlay
Build the deterministic PIL/FFmpeg overlays for the "Instagram comparison-tool reviewer" UGC ad — a white "we got a perfect 10/10 score" headline pill (trailing medal), an orange "but here's also why you'll love us" sub pill (trailing finger-down, width-matched to the header), and 3-4 green-check proof pills — then composite them onto a base clip in the format's signature diagonal cascade and mux the music into the master. FREE and deterministic: the pills are PIL-rendered so the score, checks, and wordmark stay pixel-crisp (a video model would smear type). The base clip (create-image-fal keyframe -> create-video-fal i2v) and the music bed (create-music-elevenlabs) come from separate paid capabilities; this one only does the free rendering.
## Run
fetch_icons.py --run-dir <run> ; build_overlays.py --config config.json --out-dir <run>/generated/overlays ; compose_master.py --config config.json --run-dir <run> — reads <run>/generated/clip-handheld.mp4 + generated/music-bed.m4a, writes <run>/master-final.mp4. 1080x1920, deterministic, no paid calls. (Add --no-music to compose for a silent design preview.)
## Scripts
- `fetch_icons.py` — downloads the three Twemoji PNGs (medal 1f3c5, finger-down 1f447, check 2705) to `<run>/assets/icons`. PIL cannot render Apple Color Emoji, so pills paste Twemoji PNGs. Free, local.
- `build_overlays.py` — PIL: renders the white score header (trailing medal), the orange subhead (trailing finger-down, width-matched to the header), and N green-check proof pills auto-sized to their copy. Bold weight and icon-centered-on-pill-middle are load-bearing.
- `compose_master.py` — FFmpeg: scale/crop the base clip to 1080x1920@30, composite the always-on headers, cascade the proof pills (each `enable='gte(t,T)'` on its own alternating LEFT/RIGHT row), mux the music, apply the anti-AI grain pass, re-encode crf23/maxrate12M -> master-final.mp4.
## Contract
- Deterministic + FREE (PIL + FFmpeg); no paid calls, no AI-rendered text — the score, checks, and wordmark are composited, never generated.View the complete source on GitHubrender-song-mv
When your agent uses it
Assemble a song-driven music-video ad from a config — a generated sung track carries the whole narration across N tableaux (one keyframe -> one i2v clip per lyric beat) with NO separate voiceover, captions synced to the song's OWN word timings (script-window, never Whisper) and the hook word landing on the chorus drop, closed on a PIL brand end card. This is the FREE deterministic assembly stage (clip cut-to-timeline + captions + end card + FFmpeg composite); the song, keyframes, and clips come from create-music-elevenlabs / create-image-fal / create-video-fal. Use for the song-driven-music-video format.
What it loads into context
Frontmatter
148 tokensAlways available to the agent
SKILL.md
1,217 tokensWhen the skill is activated
Reference documents
2,752 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Run
- Contract (the free assembly)
Files
SKILL.mdcore4,898 bytesscripts/PIPELINE.mddoc5,593 bytesscripts/README.mddoc3,455 bytesscripts/config.example.jsonasset16,911 bytesskill.meta.jsonasset169 bytestests/smoke-test.mddoc1,449 bytes
Read SKILL.md
# render-song-mv
Assemble a song-driven music-video ad from a config: a purpose-written, **sung** song is
the entire narration (no separate voiceover), and every visual beat is timed to the lyrics.
The delivered song sets the timeline; N tableaux (one keyframe → one image-to-video clip per
lyric beat, all in a single look pack) are cut to their lyric windows and hard-concatenated
on the beat, captions are built from the song's OWN word timings with the hook line landing
on the chorus drop, and the spot closes on a PIL brand end card. It reads like a tiny animated
music video, not a demo. `scripts/config.example.json` is one worked example (Fernhollow "Bring The
Green Back Home", 28s paper-craft 9:16) — its style, song, vocalist, mood, protagonist and
setting are that demo's answers, not defaults; `scripts/PIPELINE.md` maps every config block
to its step and `scripts/README.md` documents the free assembly.
## ChoicesView the complete source on GitHubrender-split-screen-creator
When your agent uses it
Assemble a split-screen creator ad from a config: an AI-creator lip-sync take fills the bottom half while real 16:9 product or demo clips play uncropped in the top half over a blurred fill of the same clip (never black bars), with a brand-colour divider between them. Scenes follow the voiceover timing and are joined hard, an end card holds about 3 seconds, then the finished cut is transcribed and word-level captions are burned in the chosen style. Free, deterministic assembly and captions; the voiceover comes from create-vo-elevenlabs, the creator anchor from create-image-gpt-image-fal, and the lip-sync take is supplied as an input. Use for the split-screen-creator format.
What it loads into context
Frontmatter
165 tokensAlways available to the agent
SKILL.md
1,797 tokensWhen the skill is activated
Reference documents
3,215 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Run
- Contract (the free assembly)
Files
SKILL.mdcore6,946 bytesSKILL.mdcore6,946 bytesSKILL.mdcore6,946 bytesscripts/PIPELINE.mddoc6,292 bytesscripts/README.mddoc3,968 bytesscripts/config.example.jsonasset10,133 bytesskill.meta.jsonasset182 bytestests/smoke-test.mddoc1,571 bytes
Read SKILL.md
# render-split-screen-creator
Assemble a **split-screen creator** ad from a config: a two-zone vertical
(1080×1920, 9:16, ~40s) format where an **AI creator talking-head** anchors the
BOTTOM ~48% of the frame and **real 16:9 product/demo clips** run uncropped in
the TOP ~52%, a 3px brand-color divider between the zones. The creator delivers
the whole VO cold-to-camera and each top clip proves the claim its VO line makes.
This capability is the **FREE, deterministic assembly + captions** — the two-zone
composite (contain-fit + blurred-cover fill + divider + creator slice), the
hard-concat, the end card, and the word-level caption burn from the assembled cut.
`scripts/config.example.json` is one worked example (the fictional
Larderloop "whole Sunday" demo, ~40s 1080×1920 9:16, 6 scenes + an end card) — copy its
structure, never its creative values;View the complete source on GitHubrender-stopmotion-hand-swatch-cycle
When your agent uses it
Assemble a stop-motion hand-swatch-cycle product-demo ad from a config — a sequence of still PLATES (one hand swiping a single-barrel product across a test surface, the barrel + swatch changing per plate while the hand, background, crop, and lighting stay locked) is PNG→mp4 loop-encoded at each plate's own stop-motion hold (fast motion frames 150–250ms, per-shade ~380ms, hero beats 1100–1800ms), concat-demuxed with HARD cuts into a silent master, closed on a Playwright HTML-rendered branded end card (serif tagline + sans subtitle + real logo SVG over a hero BG, never AI-rendered text), and muxed with a pre-sourced music track playing under the end card with a fade tail (no VO). This is the FREE deterministic assembly stage (loop-encode + concat-demux + end-card render + music mux); the master-anchor plate, shade plates, and end-card BG come from create-image-gpt-image-fal and the track from create-music-elevenlabs. Use for the stopmotion-hand-swatch-cycle format.
What it loads into context
Frontmatter
249 tokensAlways available to the agent
SKILL.md
1,260 tokensWhen the skill is activated
Reference documents
2,792 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Contract (the free assembly)
Files
SKILL.mdcore4,990 bytesSKILL.mdcore4,990 bytesscripts/PIPELINE.mddoc5,796 bytesscripts/README.mddoc3,053 bytesscripts/config.example.jsonasset11,456 bytesskill.meta.jsonasset190 bytestests/smoke-test.mddoc1,481 bytes
Read SKILL.md
# render-stopmotion-hand-swatch-cycle
Assemble a **stop-motion hand-swatch-cycle** ad from a config: a fast, tactile product demo where a
single hand swipes ONE product barrel across a test surface, and the shade of
the barrel AND the painted swatch stripe changes on every frame while the hand, background, crop,
and lighting hold still — cycling the variant family so the viewer self-identifies their match, then
a hero-pick payoff and a branded end card. The hand, background color, test surface, hero variant
and music are the recipe's user choices; this capability only assembles the plates it is given. This capability is the **FREE, deterministic assembly** —
the per-plate PNG→mp4 loop encode, the concat-demux, the end-card render, and the music mux.
`scripts/config.example.json` is the worked example — reference only, never the default (Kestrel
Art Supply "Swipe Your Color": an oil-pastel stick, a medium-tan hand, mustard-yellow background, round paper card; ~16.6s 1080×1920
9:16, ~24 cycle plates + finale beats + a 3s end card); `scripts/PIPELINE.md` maps every config
block to its source step and `scripts/README.md` documents the free assembly.View the complete source on GitHubrender-street-interview
When your agent uses it
Write a street-interview ad from a complete inspected commercial interaction and current brand facts. Render product guessing, or prepare mic-only, prepared-sample or visible-task conversation script/prompt previews. Premise, actions and ad connection vary; capture rules stay fixed. Conversation media delivery is unverified.
What it loads into context
Frontmatter
146 tokensAlways available to the agent
SKILL.md
3,904 tokensWhen the skill is activated
Reference documents
27,607 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- render-street-interview
- Script first: choose the execution
- Opt-in H3 Max generation
- Run (historical default endpoint)
- Prompt length
- Guarantees
- Cost
- Local finishing
- Opt-in hold and handover settings
- Known limits
- Provenance
Scripts executed separately
scripts/bench.pyscripts/brandkit.pyscripts/build.pyscripts/build_episode.pyscripts/build_looks.pyscripts/check-cut.pyscripts/conversation.pyscripts/edit_timeline.pyscripts/falsify-all.pyscripts/fit_grade.pyscripts/format_spec.pyscripts/measure-pace.pyscripts/media_proxy.pyscripts/paths.pyscripts/phone_look_video.pyscripts/prepare_script_context.pyscripts/recut.pyscripts/selftest.pyscripts/single_gen.pyscripts/variants_gen.pytests/test_cast_advice.pytests/test_conversation.pytests/test_edit_timeline.pytests/test_finishing.pytests/test_h3_provider_route.pytests/test_opt_in_hold_grammar.pytests/test_prompt_budget.pytests/test_recut_media.pytests/test_selector_route.pytests/test_single_gen_rejection.pytests/test_skin_and_voice_options.py
Files
REFERENCE.mddoc7,615 bytesSKILL.mdcore17,056 bytesSKILL.mdcore17,056 bytesSKILL.mdcore17,056 bytesSKILL.mdcore17,056 bytesSKILL.mdcore17,056 bytesSKILL.mdcore17,056 bytesSKILL.mdcore17,056 bytesSKILL.mdcore17,056 bytesSKILL.mdcore17,056 bytesTAKES.mddoc1,550 bytesbrands/demo-tallgrass-oat.jsonasset4,026 bytesbrands/fizzroot-ep3-a.jsonasset2,270 bytesbrands/fizzroot-ep3-b.jsonasset2,624 bytesbrands/fizzroot-ep3-c.jsonasset2,308 bytesbrands/grimwater.jsonasset4,738 bytesbrands/oleara-ep1-a2.jsonasset2,538 bytesbrands/oleara-ep1-b.jsonasset2,780 bytesbrands/oleara-ep1-c.jsonasset2,517 bytesepisodes/fizzroot-ep3.jsonasset1,009 bytesepisodes/oleara-ep1.jsonasset784 bytesreferences/cast-writing.mddoc9,842 bytesreferences/h3-generation.mddoc2,278 bytesreferences/model-behaviors.mddoc5,072 bytesreferences/reference-format-rules.mddoc7,633 bytesreferences/reference-ledger-items-01-23.mddoc16,015 bytesreferences/reference-ledger-items-17-28.mddoc13,517 bytesreferences/reference-ledger-items-29-42.mddoc14,616 bytesreferences/reference-pipeline.mddoc7,480 bytesreferences/street-reference-library.jsonasset6,801 bytesreferences/street-script-writing.mddoc17,147 bytesscripts/bench.pyruns18,647 bytesscripts/brandkit.pyruns19,770 bytesscripts/build.pyruns8,170 bytesscripts/build_episode.pyruns79,409 bytesscripts/build_looks.pyruns32,933 bytesscripts/check-cut.pyruns67,874 bytesscripts/conversation.pyruns13,069 bytesscripts/edit_timeline.pyruns7,809 bytesscripts/falsify-all.pyruns20,277 bytesscripts/fit_grade.pyruns7,933 bytesscripts/format_spec.pyruns95,424 bytesscripts/measure-pace.pyruns2,877 bytesscripts/media_proxy.pyruns58,192 bytesscripts/paths.pyruns3,047 bytesscripts/phone_look_video.pyruns7,343 bytesscripts/prepare_script_context.pyruns12,330 bytesscripts/recut.pyruns27,113 bytesscripts/selftest.pyruns24,021 bytesscripts/single_gen.pyruns25,497 bytesscripts/variants_gen.pyruns14,293 bytesskill.meta.jsonasset656 bytestests/READINESS.mddoc13,579 bytestests/fixtures/brands/grimwater-4816.jsonasset4,681 bytestests/fixtures/brands/grimwater-4817.jsonasset2,315 bytestests/fixtures/brands/grimwater-4818.jsonasset2,620 bytestests/fixtures/brands/grimwater-4819.jsonasset2,159 bytestests/fixtures/brands/grimwater-4820.jsonasset2,883 bytestests/fixtures/brands/grimwater-4821.jsonasset2,856 bytestests/fixtures/brands/grimwater-4822.jsonasset2,543 bytestests/fixtures/brands/grimwater-4823.jsonasset2,376 bytestests/fixtures/brands/grimwater-4824.jsonasset4,242 bytestests/fixtures/brands/grimwater-4827.jsonasset4,736 bytestests/fixtures/brands/grimwater-4828.jsonasset4,402 bytestests/fixtures/brands/grimwater-4829.jsonasset3,926 bytestests/fixtures/brands/grimwater-4830.jsonasset4,007 bytestests/fixtures/brands/grimwater-4831.jsonasset4,316 bytestests/fixtures/brands/grimwater-4832.jsonasset3,621 bytestests/fixtures/brands/grimwater-4833.jsonasset3,810 bytestests/fixtures/brands/grimwater-4834.jsonasset3,958 bytestests/fixtures/brands/grimwater-4835.jsonasset3,994 bytestests/fixtures/episodes/grimwater-ep1.jsonasset2,264 bytestests/fixtures/episodes/grimwater-ep2.jsonasset2,240 bytestests/fixtures/episodes/grimwater-ep2fix-v2.jsonasset5,023 bytestests/fixtures/episodes/grimwater-ep2fix-v3.jsonasset5,791 bytestests/fixtures/episodes/grimwater-ep2fix.jsonasset3,778 bytestests/fixtures/episodes/grimwater-ep3.jsonasset2,531 bytestests/fixtures/episodes/grimwater-ep3b.jsonasset2,308 bytestests/fixtures/episodes/grimwater-ep3c.jsonasset2,361 bytestests/fixtures/episodes/grimwater-ep4.jsonasset3,802 bytestests/fixtures/prompt-snapshots.jsonasset20,830 bytestests/smoke-test.mddoc627 bytestests/test_cast_advice.pyruns3,685 bytestests/test_conversation.pyruns20,962 bytestests/test_edit_timeline.pyruns8,842 bytestests/test_finishing.pyruns11,163 bytestests/test_h3_provider_route.pyruns9,388 bytestests/test_opt_in_hold_grammar.pyruns4,825 bytestests/test_prompt_budget.pyruns10,795 bytestests/test_recut_media.pyruns6,338 bytestests/test_selector_route.pyruns8,950 bytestests/test_single_gen_rejection.pyruns7,819 bytestests/test_skin_and_voice_options.pyruns4,216 bytes
Read SKILL.md
> **Superseded:** the video kit now makes street interviews with goose-studio's street-interview style, which uses the video-h3max part, version 1.0.0 (the take), the transcribe-whisper part, version 1.1.2 and the speech-recut part, version 1.0.2 (the cut), the html-frames part, version 1.2.1 (the overlay), the end-card part, version 1.1.1 and the assemble part, version 1.2.0, in the parts folder of this repository. Its recipes are retired in goose-studio. This renderer stays, unchanged in behaviour, because the write-video-ad-script skill runs its script-context step; its scripts still run.
# Human version
## render-street-interview
**Summary.** This is the renderer for the **street-interview** ad format. Product guessing retains its
visible object and reveal. Conversation supports mic-only, prepared-sample and visible-task
**script/prompt previews**. Choose a coherent situation and earned ad connection before
writing words. People are generated; conversation media delivery remains unverified.
---
# Agent versionView the complete source on GitHubrender-value-prop
When your agent uses it
Render a designed 'value prop' video from a config — 3-5 noun-phrase benefit claims (<=4 words each) revealed sequentially over per-SKU product visuals, one crisp editorial frame per claim (hook sticker -> N claim beats -> brand end card). Deterministic PIL/HTML beat renderer frame-stepped via Playwright and encoded with FFmpeg, sound-off legible, hard cuts, uniform pacing. FREE (no paid calls); music is added separately (create-music-elevenlabs). Use for the value-prop format.
What it loads into context
Frontmatter
124 tokensAlways available to the agent
SKILL.md
1,059 tokensWhen the skill is activated
Reference documents
120 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Choices
- Contract
Scripts executed separately
scripts/build_storyboard_preview.pyscripts/build_text_overlays.pyscripts/render_hyperframe.pyscripts/render_master.pyshared/_shared.jsshared/animations/sachet-entrance/cascade-from-top.jsshared/animations/sachet-entrance/fade-stagger.jsshared/animations/sachet-entrance/slide-in-lateral.jsshared/animations/sachet-entrance/springScale-pop.jsshared/animations/sachet-entrance/tilt-fan.jsshared/animations/text-entrance/fade-stagger.jsshared/animations/text-entrance/mask-reveal.jsshared/animations/text-entrance/type-on.jsshared/animations/text-entrance/word-by-word.js
Files
SKILL.mdcore4,280 bytesscripts/build_storyboard_preview.pyruns13,005 bytesscripts/build_text_overlays.pyruns8,705 bytesscripts/config.example.jsonasset2,225 bytesscripts/render_hyperframe.pyruns4,660 bytesscripts/render_master.pyruns18,967 bytesshared/_shared.cssasset4,869 bytesshared/_shared.jsruns2,556 bytesshared/animations/registry.ymlasset4,498 bytesshared/animations/sachet-entrance/cascade-from-top.jsruns980 bytesshared/animations/sachet-entrance/fade-stagger.jsruns1,015 bytesshared/animations/sachet-entrance/slide-in-lateral.jsruns1,260 bytesshared/animations/sachet-entrance/springScale-pop.jsruns883 bytesshared/animations/sachet-entrance/tilt-fan.jsruns1,095 bytesshared/animations/text-entrance/fade-stagger.jsruns1,341 bytesshared/animations/text-entrance/mask-reveal.jsruns1,124 bytesshared/animations/text-entrance/type-on.jsruns1,324 bytesshared/animations/text-entrance/word-by-word.jsruns1,896 bytesshared/beat-templates/endcard-wordmark.htmlasset2,184 bytesshared/beat-templates/hook-sticker.htmlasset2,682 bytesshared/beat-templates/prop-hero.htmlasset2,916 bytesshared/beat-templates/prop-row.htmlasset3,216 bytesskill.meta.jsonasset212 bytestests/smoke-test.mddoc488 bytes
Read SKILL.md
# render-value-prop
Render a designed 'value prop' video from a config: a hook sticker, then one beat per short noun-phrase benefit claim (<=4 words each — "Drug-Free", "Zero Sugar", "NSF Certified"), each pairing the claim headline with a per-SKU product visual (the hero SKU rotates beat to beat so the eye anchor shifts), then a brand-wordmark end card. Text + product carry the spot — no narration, no talking head — and it is built to be legible sound-off. Every beat is a pure function of beat-local time `t` (deterministic PIL start frames + Playwright hyperframes + FFmpeg); no CSS keyframes, no setTimeout. FREE (no paid calls); music is a separate capability (create-music-elevenlabs), or ship silent for free.
## Run
`render_master.py --config config.json --project <dir>` -> `<dir>/finals/master-clean.mp4` (silent),
1080x1920, deterministic, no paid calls. The renderer is **fully config-driven** — palette, copy, SKUs,
pacing, hook, logo and end card all come from `config.json` (schema = `ad_sample.recipe.config`;
see `config.example.json`). Nothing is hardcoded to one brand. `build_storyboard_preview.py` is an
optional free preview gallery for the gate; `build_text_overlays.py` is optional (transparent
text-zone PNGs for compositing claims over a motion clip). Both preview scripts take their ink,
background, brand name and logo from `shot-list.yml` `project:` or the project's `config.json`
(neutral fallbacks otherwise). `shared/beat-templates/` are reference layouts with placeholder copy;
the renderer does not read them.View the complete source on GitHubrender-vignette
When your agent uses it
Assemble a short-form 'vignette' ad from clean product cutouts composited over a kinetic background video — birefnet cutout, then a cold-open text card + product carousel + annotated specimen-sheet end card, plus loudnorm + separate-pass music mux. FREE assembly (PIL + rsvg + FFmpeg); the recipe supplies the config and gates the paid BG/cutout/music calls to their own capabilities. Use for the vignette format.
What it loads into context
Frontmatter
105 tokensAlways available to the agent
SKILL.md
1,328 tokensWhen the skill is activated
Reference documents
204 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run
- Choices
- Contract
- Gaps / routing notes
Scripts executed separately
scripts/composite_variants.pyscripts/media_proxy.pyscripts/music_and_mux.pyscripts/render_overlays.pyscripts/strip_product_backgrounds.py
Files
SKILL.mdcore5,292 bytesSKILL.mdcore5,292 bytesscripts/composite_variants.pyruns8,604 bytesscripts/media_proxy.pyruns58,192 bytesscripts/music_and_mux.pyruns7,302 bytesscripts/render_overlays.pyruns7,288 bytesscripts/strip_product_backgrounds.pyruns5,974 bytesskill.meta.jsonasset225 bytestests/smoke-test.mddoc706 bytes
Read SKILL.md
# render-vignette
Assemble a short-form 'vignette' ad from clean product cutouts composited over a kinetic background video. Motion lives in the BG video; the product rides on top as a static cutout layer. Music-led, zero VO, sub-12s, loopable — it reads muted because the product label + on-screen copy carry the message. Defaults to the V-CARD structure: a cold-open text card → a product carousel under one shared BG → an annotated specimen-sheet end card.
## Run
1. `strip_product_backgrounds.py` — birefnet cutout of each PDP shot to clean hard-edge alpha (no halo/shadow).
2. `render_overlays.py` — PIL + `rsvg-convert` render the cold-open card (`cold_open_text` in `cold_open_font`, dead-center) + the annotated specimen-sheet end card (brand SVG logo + `end_card.lines` annotations) as transparent 1080x1920 PNGs. Text colour follows `end_card.logo_variant`. FREE.
3. `composite_variants.py` — one FFmpeg `filter_complex` per BG variant: BG (palette-aware dim) → cold-open overlay → cutouts (width-anchored, vertically centered `y=(H-h)/2`) → end card. h264 crf20 yuv420p +faststart 30fps. FREE.
4. `music_and_mux.py` — instrumental music bed from `config.music.prompt` → `acompressor + loudnorm I=-18:TP=-2:LRA=9` → muxed into every variant in a SEPARATE pass with explicit `-map 0:v:0 -map 1:a:0`. The mux is FREE; the music generation is a paid call that in prod routes through create-music-elevenlabs.
Every script reads `config.json` (`--config <path>`, `$VIGNETTE_CONFIG`, `<project>/config.json` or `scripts/config.json`) and exits naming any missing required field — there are no built-in demo values.
## Choices
View the complete source on GitHubrender-vo-anchored-motion-listicle
When your agent uses it
Assemble a narrated motion-graphic listicle video ad from a config: a voiceover (cloned or cast, in the chosen tone) reads a numbered list while N animated web-graphic beats in one branded design system (alternating tiles, big numerals, callouts) are rendered frame by frame and timed to the voiceover's words. Optional B-roll windows (a brand clip, an AI clip or a motion graphic) give the eye a break, and captions appear only inside those windows, with the voiceover mixed over a low music bed. Free, deterministic assembly; the voiceover, music and any AI clips come from create-vo-elevenlabs, create-music-elevenlabs and create-video-fal. Use for the vo-anchored-motion-listicle format.
What it loads into context
Frontmatter
178 tokensAlways available to the agent
SKILL.md
1,572 tokensWhen the skill is activated
Reference documents
3,438 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choices
- Run
- Contract (the free assembly)
Files
SKILL.mdcore6,280 bytesSKILL.mdcore6,280 bytesscripts/PIPELINE.mddoc7,200 bytesscripts/README.mddoc3,941 bytesscripts/config.example.jsonasset9,927 bytesskill.meta.jsonasset189 bytestests/smoke-test.mddoc1,656 bytes
Read SKILL.md
# render-vo-anchored-motion-listicle
Assemble a **narrated motion-graphic listicle** ad from a config: a spoken voiceover carries a numbered listicle (hook + N points + CTA) and every visual beat is anchored to
the VO's word-level timestamps. Each beat is a **web-animated hyperframe** (an HTML page + the Web
Animations API driven by `window.renderAt(t)`) rendered to video frame-by-frame with Playwright, all
in ONE branded design system (alternating background tiles, big hero numerals, body type, decorative
accents, callouts). Optional color-graded **breather windows** give visual breath, and
captions burn **only on the B-roll windows**. The shipped master is pure motion-graphic + VO — there
is NO lipsync (the still headshot is kept only for a future lipsync variant). This capability
is the **FREE, deterministic assembly** — the Playwright beat render, the ffmpeg concat, the
window-masked caption burn, the VO+music mix, and the final composite.
`scripts/config.example.json` is the worked example (Truehour "doctor-educator" listicle, ~66s
1080×1920 9:16 at 25fps) — copy its structure, never its creative values; `scripts/PIPELINE.md` maps every config block to its source step andView the complete source on GitHubrender-whiteboard-explainer
When your agent uses it
Assemble a whiteboard explainer video ad from a beats file — a narrator explains one idea while a real whiteboard fills up in black marker, with a hand-lettered title, bulleted rows down the left, a drawing filling the right, and a payoff that letters the closing line and rings the claim. The board is a PHOTOGRAPH and the ink is multiplied onto it, so the surface sheen and window light come through the strokes; the drawings are generated as line art and traced to ordered strokes, then revealed in drawing order on the word they belong to. The layout is SOLVED from the beats, never hand-placed. FREE assembly (Pillow plus ffmpeg) apart from one board photo and one drawing per subject, both one-time per brand. Use for the whiteboard format.
What it loads into context
Frontmatter
175 tokensAlways available to the agent
SKILL.md
1,961 tokensWhen the skill is activated
Reference documents
176 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The three decisions that make this format work
- Choices
- What it renders
- Non-negotiables
- Inputs
- Checks it runs itself
- Cost
- Honest ceiling
Scripts executed separately
scripts/anchors.pyscripts/gen-art.pyscripts/gen-voice.pyscripts/illos.pyscripts/lettering.pyscripts/make-episode.pyscripts/master.pyscripts/media_proxy.pyscripts/prep-plate.pyscripts/render.pyscripts/solve-layout.pyscripts/trace.pytests/test_whiteboard_portable.py
Files
SKILL.mdcore8,553 bytesassets/fonts/NOTICE.mddoc740 bytesassets/fonts/PermanentMarker-Regular.ttfasset74,752 bytesassets/fonts/TitanOne-Regular.ttfasset52,708 bytesscripts/anchors.pyruns1,979 bytesscripts/beats.example.jsonasset2,125 bytesscripts/gen-art.pyruns6,509 bytesscripts/gen-voice.pyruns5,297 bytesscripts/illos.pyruns16,182 bytesscripts/lettering.pyruns12,063 bytesscripts/make-episode.pyruns6,077 bytesscripts/master.pyruns4,478 bytesscripts/media_proxy.pyruns58,192 bytesscripts/prep-plate.pyruns5,928 bytesscripts/render.pyruns17,515 bytesscripts/solve-layout.pyruns12,097 bytesscripts/trace.pyruns6,374 bytesskill.meta.jsonasset452 bytestests/test_whiteboard_portable.pyruns2,505 bytes
Read SKILL.md
# render-whiteboard-explainer
The renderer for the **whiteboard** video ad format: a voice explains one idea while a board
fills up in marker, the way a graphic recorder works a room. Every mark lands on the word it
belongs to, and the board is wiped and reused between sections.
Siblings in the chat-UI family are `render-imessage-chat` and `render-chatgpt-chat`, where a
screen is the creative. Reach for this one when the creative
is **someone explaining a thing by drawing it**.
## The three decisions that make this format work
**The board is a photograph.** A drawn board reads as a drawn board, and a plain white frame
reads as a sketch film. Both were built and both were rejected. One generated still of a realView the complete source on GitHubreview-finished-ad
When your agent uses it
Final QC gate for a rendered 9:16 video ad, run before it is published. One script checks what a machine can decide — exact 1080x1920 size, a hook that moves and speaks in the first second, no frozen stretches, no dead air, no black frames, the brand's real logo on the end card (never a favicon, never a redrawn or wrong logo), end-card colours near the brand palette — and builds one contact sheet (frames with the TikTok/Reels UI safe zones shaded, beside the logo, product images and a font specimen) for the checks that need eyes — font, product likeness, product consistency across scenes, safe zones. A declared silent-text profile covers silent, text-led formats such as kinetic text (no audio track needed, short blank beats between text beats allowed within fixed bounds). Exit 0 PASS / 2 FAIL / 3 ERROR. Use on every finished video master before pinning it.
What it loads into context
Frontmatter
222 tokensAlways available to the agent
SKILL.md
3,231 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Run it
- Machine checks
- Eye checks — read the sheet every time
- Fix loop
- Output
Scripts executed separately
scripts/review_finished_ad.pytests/test_overrun_freeze_clicks.pytests/test_review_finished_ad.pytests/test_sampling.pytests/test_silent_text_profile.py
Files
SKILL.mdcore12,283 bytesSKILL.mdcore12,283 bytesscripts/review_finished_ad.pyruns66,940 bytesskill.meta.jsonasset201 bytestests/test_overrun_freeze_clicks.pyruns29,532 bytestests/test_review_finished_ad.pyruns11,809 bytestests/test_sampling.pyruns1,057 bytestests/test_silent_text_profile.pyruns21,389 bytes
Read SKILL.md
> **Superseded:** the video kit now does this with the check-layer part, version 1.2.0, in the parts folder of this repository. It runs the machine checks every finished video gets: it plays, length, size, sound level, captions, black and frozen frames and the end card. This atom stays, unchanged in behaviour, for skills outside the kit until they move; its scripts still run.
# review-finished-ad
The gate between a rendered master and the user. A finished ad has to look like
the brand's ad and play like an ad, not like a pile of clips. This skill checks
both, fixes are made by the caller, and the gate is re-run until it passes.
## Run it
Needs `ffmpeg` + `ffprobe` on PATH and `pip install --quiet numpy pillow`.
```bash
python3 scripts/review_finished_ad.py \View the complete source on GitHubreview-ugc-render
When your agent uses it
Mandatory pre-publish review gate for a UGC video render. Transcribes the finished render's AUDIO with Whisper and word-diffs it against the approved spoken script, then gates keeping the render as the final version (video_review) — blocking a render whose generated audio mis-voices a word (e.g. the approved "human-vetted" spoken as "human witted"), says a different number or brand name, flips a negation, drops an approved phrase, or comes back silent. Correct speech written differently ("5mg" said "five milligrams", "30%" said "thirty percent", a spoken URL, "don't" said "do not", "larkfieldstraps" said "larkfield straps", a confirmed pronunciation like "TG1" said "T G one") passes. Runnable, gating counterpart to GooseWorks' fuller transcript-integrity review. Every ugc-video-formats recipe runs this after render and BEFORE keeping the final version.
What it loads into context
Frontmatter
232 tokensAlways available to the agent
SKILL.md
3,738 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Why this exists
- When to run
- Contract
- What counts as the same speech
- What still FAILS
- Brand names and confirmed pronunciations
- Inputs
- Tests
- Relationship to the fuller review
Scripts executed separately
scripts/review_render.pytests/test_review_render.py
Files
SKILL.mdcore13,858 bytesSKILL.mdcore13,858 bytesSKILL.mdcore13,858 bytesscripts/review_render.pyruns52,451 bytesskill.meta.jsonasset197 bytestests/test_review_render.pyruns31,616 bytes
Read SKILL.md
> **Superseded:** the video kit now does this with the check-layer part, version 1.2.0, in the parts folder of this repository. It runs the same speech-against-script rules on every video with speech: numbers, units, negations and brand names must match, and confirmed pronunciations count as the written name. This atom stays, unchanged in behaviour, for skills outside the kit until they move; its scripts still run.
# review-ugc-render
> The QC gate every UGC video recipe MUST clear before it publishes. Not an
> eyeball `/watch` — a deterministic transcript-vs-script diff that exits non-zero
> on a defect so the recipe can hard-stop keeping the render as the final version
> (`video_review`).
**In short:** it compares what the render actually SAYS with the script the user
approved. Correct speech that is only written differently passes (numbers, units,
URLs, contractions, fused brand names, confirmed pronunciations). A wrong number,
a flipped negation, a mis-voiced word or brand, a dropped phrase or silence fails.
View the complete source on GitHubstitch-videos-ffmpeg
When your agent uses it
Stitch video segments with ffmpeg concat, xfade, overlay, audio mux, and export settings, and trim a source into named clips at exact windows (trim_clips.py). Ships montage.py, a free montage assembler (python3 + ffmpeg, no keys). It takes a JSON EDL of clips and stills, normalizes them and hard-cuts them in order, burns captions from an SRT, a cue list or word timings, and lays a VO over a music bed that ducks under it, mastered to -14 LUFS.
What it loads into context
Frontmatter
131 tokensAlways available to the agent
SKILL.md
3,803 tokensWhen the skill is activated
Reference documents
518 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Purpose
- Montage helper: `scripts/montage.py`
- Trim mode: `scripts/trim_clips.py`
- FFmpeg notes
- Inputs
- Workflow
- Output
- Quality Checks
- Failure Modes
Scripts executed separately
scripts/composite.pyscripts/composite_final.pyscripts/composite_final.shscripts/montage.pyscripts/normalize_clip.shscripts/trim_clips.pyscripts/voiceless/composite.pytests/test_stitch_montage.pytests/test_trim_clips.py
Files
SKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesSKILL.mdcore13,689 bytesscripts/composite.pyruns4,936 bytesscripts/composite_final.pyruns3,546 bytesscripts/composite_final.shruns295 bytesscripts/montage.pyruns50,440 bytesscripts/normalize_clip.shruns668 bytesscripts/trim_clips.pyruns7,259 bytesscripts/voiceless/composite.pyruns4,597 bytesskill.meta.jsonasset190 bytestests/expected-output.mddoc300 bytestests/human-test.mddoc853 bytestests/sample-input.mddoc568 bytestests/smoke-test.mddoc642 bytestests/test_stitch_montage.pyruns18,536 bytestests/test_trim_clips.pyruns2,231 bytes
Read SKILL.md
# stitch-videos-ffmpeg
## Purpose
Stitch video segments with ffmpeg concat, xfade, overlay, audio mux, and export settings.
Implementation status: refactored from existing repository skills. The workflow consolidates behavior that previously lived across larger skills.
Sources: ad-studio, voiceover-product-ad, ugc-product-video, voiceless-music-transformation-reel, product-stopmotion-ad.
Extraction notes: assembly and composite scripts.
## Montage helper: `scripts/montage.py`
View the complete source on GitHubugc-fixloop
When your agent uses it
the UGC fix-loop toolkit — surgically re-render a bad window/beat of a single-take UGC master (stitch_replacement.py, pure FFmpeg) and GPT cross-model review a Seedance prompt before render (vet_seedance_prompt.py, routed through the openai-proxy). Fetch it into a one-shot UGC recipe so both scripts resolve on any machine and the vet call charged to your GooseWorks credits.
What it loads into context
Frontmatter
101 tokensAlways available to the agent
SKILL.md
917 tokensWhen the skill is activated
Reference documents
461 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Env / deps
- Run — vet_seedance_prompt.py (GPT cross-model prompt review)
- Run — stitch_replacement.py (surgical beat/window swap, deterministic)
Scripts executed separately
scripts/stitch_replacement.pyscripts/vet_seedance_prompt.py
Files
SKILL.mdcore3,515 bytesscripts/stitch_replacement.pyruns6,503 bytesscripts/vet_seedance_prompt.pyruns5,996 bytesskill.meta.jsonasset221 bytestests/smoke-test.mddoc1,709 bytes
Read SKILL.md
# ugc-fixloop
The UGC fix-loop toolkit. The one-shot UGC video recipes (`create-ugc-*-video-from-refs`)
render a single continuous Seedance 2.0 reference-to-video master with native lip-synced
audio. This capability ships the two scripts those recipes run, so they exist on the remote
machine (fetched into `/tmp/gooseworks-scripts/ugc-fixloop/`).
> Any re-render of a replacement clip goes through the same proxy path the recipe uses for
> the take (`create-video-fal` / fal-proxy), NEVER a direct `fal.run` call.
## Env / deps
- **`stitch_replacement.py`** — no API key, no network. Needs **`ffmpeg` + `ffprobe` on PATH** (all local FFmpeg).
- **`vet_seedance_prompt.py`** — routes through the GooseWorks **openai-proxy** (`<api_base>/api/internal/openai-proxy/v1/chat/completions`), reading creds from `~/.gooseworks/credentials.json` — **no direct OpenAI call, no local key**; the call **charged to your GooseWorks credits**. Exits 3 if the proxy/creds are unavailable so the recipe can fall back to an inline self-review (the vet is advisory, not a gate).
View the complete source on GitHubverify-product-image
When your agent uses it
QC gate for a generated static ad image — verify the file opens, matches the requested dimensions, shows the correct product/subject (right shape, colour, label, logo), and has no garbled text or severe artifacts. Records pass/fail/needs-human in verification.md. Used as the final check in the static ad remix flow before shipping.
What it loads into context
Frontmatter
78 tokensAlways available to the agent
SKILL.md
286 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Checks
Files
SKILL.mdcore1,312 bytesskill.meta.jsonasset149 bytes
Read SKILL.md
# verify-product-image
Verify image files open, match requested dimensions, show the requested subject/product, and have no severe artifacts.
## Checks
- Confirm required input files exist.
- Confirm output files or written plans match the skill contract.
- **Product/asset:** the featured hero is the brand's real product (or app UI for SaaS), matching the
kit asset — not a mascot, logo, or placeholder standing in for the product.
- **Brand alignment:** colours come from the intended source (the reference's palette for
`style_source: template`, the kit's documented `colors` for `brand`) — **no invented/off-brand
colour** (e.g. an accent pulled off a logo or mascot). Typography matches the kit's fonts.
- **Text/logo:** copy and label text are real and correctly spelled; any logo is the brand's correct,View the complete source on GitHubvideo-production-harness
When your agent uses it
Full video production sequence with script review, actual ingredient choices, controlled generation, editing, evidence-based quality review, polish, captions and delivery. A host binding supplies project storage, authentic approvals, provider access and billing.
What it loads into context
Frontmatter
73 tokensAlways available to the agent
SKILL.md
1,334 tokensWhen the skill is activated
Reference documents
72,800 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Non-negotiables (every state, every host)
Scripts executed separately
scripts/assemble.pyscripts/assemble_sources.pyscripts/assembly_timeline.pyscripts/check_recipe.pyscripts/final_grade.pyscripts/final_measure.pyscripts/final_measure_parts.pyscripts/pack_recipe.pyscripts/qc_evidence.pyscripts/reference_rate.pyscripts/reference_shots.pyscripts/timeline_rules.py
Files
SKILL.mdcore6,170 bytesauto-fix-from-review-notes.mddoc6,629 bytesauto-refine.mddoc5,381 bytesbrainstorm.mddoc3,258 bytescapabilities.mddoc13,894 bytescreate-clips.mddoc15,352 bytescreate-design-brief.mddoc13,735 bytescreate-storyboard.mddoc9,031 bytesedit-clip.mddoc6,507 bytesedit-video.mddoc13,080 byteslock-character.mddoc12,531 byteslock-script.mddoc8,911 bytesorchestrator.mddoc11,204 bytespolish.mddoc9,445 bytespreflight-audit.mddoc6,341 bytespromote.mddoc3,307 bytesreferences/check-severity.mddoc9,884 bytesreferences/creative-contract-and-review.mddoc11,633 bytesreferences/creator-grammar.mddoc6,823 bytesreferences/editorial-review.mddoc6,509 bytesreferences/genres/ai-creator-ugc.mddoc2,798 bytesreferences/genres/chat-ui.mddoc2,234 bytesreferences/genres/hypermotion.mddoc1,447 bytesreferences/genres/motion-graphics.mddoc1,579 bytesreferences/genres/narrator-montage.mddoc3,178 bytesreferences/genres/product-demo.mddoc2,030 bytesreferences/hook-compatibility.mddoc2,821 bytesreferences/libraries-look-and-rubric.mddoc6,175 bytesreferences/product-scale-and-world.mddoc4,338 bytesreferences/quality-tier.mddoc9,658 bytesreferences/recipe-format.mddoc7,318 bytesreferences/review-script-shortform.mddoc12,028 bytesreferences/shot-routing.mddoc15,298 bytesreferences/specialist-handoff.mddoc4,851 bytesreferences/speech-and-route-qualification.mddoc10,361 bytesreferences/talking-actor.mddoc6,805 bytesrelease.jsonasset22,643 bytesreview-video.mddoc15,359 bytesscripts/assemble.pyruns11,323 bytesscripts/assemble_sources.pyruns5,875 bytesscripts/assembly_timeline.pyruns11,648 bytesscripts/check_recipe.pyruns9,873 bytesscripts/final_grade.pyruns2,970 bytesscripts/final_measure.pyruns14,455 bytesscripts/final_measure_parts.pyruns14,957 bytesscripts/pack_recipe.pyruns11,597 bytesscripts/qc_evidence.pyruns15,329 bytesscripts/reference_rate.pyruns4,384 bytesscripts/reference_shots.pyruns13,439 bytesscripts/timeline_rules.pyruns11,064 bytesskill.meta.jsonasset820 bytesstates/edit-to-delivery.mddoc8,440 bytesstates/setup-and-script.mddoc11,009 bytesstates/storyboard-and-clips.mddoc8,293 byteswrap-session.mddoc5,991 bytes
Read SKILL.md
## Non-negotiables (every state, every host)
1. **Copy the reference.** Study the whole reference, picture and sound. Keep its people, action, camera, hook, length (±25%) and its shot and setup counts (±30%, from `scripts/reference_shots.py`); list every change in `changes_from_reference`, shown first at the script approval.
2. **Match its sound and pace.** Speech, music and effects follow the reference. Silence only when the reference is silent or the owner asks for it. Never a sine tone, a drone or an empty track. `scripts/reference_rate.py` measures the reference's words per second (never estimate it); a voice more than 10% slower is regenerated or sped up (at most 1.25×) before lip-sync and picture timing.
3. **People and demos stay people and demos.** Plan a person, hands or a live demonstration in the reference as one; never plan a text card, dots or a still in its place. One that ends up on screen anyway is an `ask` finding you recommend fixing.
4. **The script comes from write-video-ad-script.** Fetch it with catalog_fetch; never write the script inline.
5. **Use the real product.** Its real photos, its real size and its usage steps. A still packshot gets the real photo through `overlay`. A pack held or used on screen is made with `openai/gpt-image-2/edit`, the real product photo as reference image 1, front label facing the camera. A blank, unprinted or label-less brand pack is must_fix. Every use step and product state (dry contents, cooked dish, strip on the nose) comes from a real brand photo sent as a reference.
6. **Keep the approved look.** Camera, focus, lighting, texture, setting and finishing follow the brief/reference. Phone realism belongs to phone footage; studio, cinematic, stylized and animated formats keep their own look. Preserve product truth and plausible anatomy in every format. Use [libraries, look and rubric](references/libraries-look-and-rubric.md).
7. **Review the final against the reference,** listened or measured, never claimed. `scripts/qc_evidence.py` must exit 0 on the exact final bytes (it fails only a broken file); then mark the video complete and read the host's final check.
8. **Two owner approvals, both in this chat:** the script and the ingredients. In `review_mode: auto` one yes to the full total covers both (see [check severity](references/check-severity.md)). Agent checks add no other approval step.
9. **Quality warns, never blocks.** Every finding is `must_fix` (always redone, never delivered), `ask` (shown with the price of the fix; in `review_mode: auto` you decide) or `fine` (kept). Only money, consent, safety and broken files stop the run. A redo is paid from the approved total when it fits, otherwise after a new yes to its price; never drop a scene. See [check severity](references/check-severity.md).
**Reading rule.** Read one file per call. If the output says it was truncated, re-read that file in parts before acting.
View the complete source on GitHubwatch
When your agent uses it
Observe actual video and sound over the whole file or named ranges, with timestamped evidence and honest coverage. Use complementary playback, listening and targeted frames; return observations without edits or verdicts.
What it loads into context
Frontmatter
53 tokensAlways available to the agent
SKILL.md
697 tokensWhen the skill is activated
Reference documents
1,198 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Inputs and modes
- Workflow
- Outputs
- Boundaries
- References
Files
SKILL.mdcore3,757 bytesSKILL.mdcore3,757 bytesSKILL.mdcore3,757 bytesSKILL.mdcore3,757 bytesSKILL.mdcore3,757 bytesSKILL.mdcore3,757 bytesreferences/parameters.mddoc2,393 bytesskill.meta.jsonasset120 bytestests/expected-output.mddoc724 bytestests/human-test.mddoc1,121 bytestests/sample-input.mddoc692 bytestests/smoke-test.mddoc705 bytes
Read SKILL.md
# Human version
Report what the actual file shows and sounds like, with timestamps. Keep sampled
frames, moving-picture review, listening and transcription separate. Missing a
capability stays explicit; observations are not an approval verdict.
---
# Agent version
## Inputs and modes
Accept the video, optional timestamp ranges, sampling rate, frame budget, resolution,
audio dimensions and focus. Defaults describe whole-file scope, not completed review.View the complete source on GitHubwrite-video-ad-script
When your agent uses it
Write or revise a short-form ad from a sourced angle and reference. Plan connected words, product proof and sound; expose production gaps before script review.
What it loads into context
Frontmatter
52 tokensAlways available to the agent
SKILL.md
3,241 tokensWhen the skill is activated
Reference documents
19,090 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to use
- Inputs and precedence
- Step 0. Load the angle research, explicitly
- Step 1. Bind reference, format and production route before writing
- Step 2. Form the creative brief
- Step 3. Learn the reference's persuasion
- Step 4. Choose distinct angle–execution pairs
- Step 5. Write words and visuals together
- Step 6. Validate, critique, repair
- Step 7. Deliver the review
- Step 8. Learn from decisions and results
- Quality checks
- Related
- Delivery handoff
Scripts executed separately
scripts/critique_scripts.pyscripts/lint_scripts.pyscripts/media_proxy.pyscripts/prepare_angle_context.pyscripts/verify_handoff.pytests/test_angle_handoff.pytests/test_creative_brief.pytests/test_critique_scripts.pytests/test_handoff_release.pytests/test_lint_scripts.pytests/test_pacing.py
Files
SKILL.mdcore16,333 bytesSKILL.mdcore16,333 bytesSKILL.mdcore16,333 bytesSKILL.mdcore16,333 bytesSKILL.mdcore16,333 bytesSKILL.mdcore16,333 bytesSKILL.mdcore16,333 bytesSKILL.mdcore16,333 bytesreferences/angle-research.mddoc2,698 bytesreferences/buyer-and-mechanism.mddoc4,202 bytesreferences/creative-brief.mddoc4,015 bytesreferences/dialogue-writing.mddoc7,477 bytesreferences/files.mddoc20,460 bytesreferences/hook-families.mddoc6,067 bytesreferences/human-behavior.mddoc6,483 bytesreferences/judge-contract.mddoc10,181 bytesreferences/pacing.mddoc4,306 bytesreferences/reference-and-performance.mddoc3,551 bytesreferences/scene-and-hook.mddoc8,575 bytesreferences/validate-and-repair.mddoc6,051 bytesreferences/voice.mddoc5,311 bytesscripts/critique_scripts.pyruns27,463 bytesscripts/lint_scripts.pyruns57,488 bytesscripts/media_proxy.pyruns58,192 bytesscripts/prepare_angle_context.pyruns11,156 bytesscripts/verify_handoff.pyruns12,827 bytesskill.meta.jsonasset590 bytestests/test_angle_handoff.pyruns15,224 bytestests/test_creative_brief.pyruns6,232 bytestests/test_critique_scripts.pyruns12,488 bytestests/test_handoff_release.pyruns6,349 bytestests/test_lint_scripts.pyruns26,492 bytestests/test_pacing.pyruns15,223 bytes
Read SKILL.md
# Human version
**Summary.** Turn a researched advertising promise into a feasible video in the requested
format. First load angle research, then bind it to the agreed story, visuals, timing and
assets. Write and check the complete concept before the user reviews it. The output is one
recommended script, its visual plan and up to two viable alternatives. A model score is a
quality screen; ad results establish performance.
---
# Agent version
## When to use
View the complete source on GitHubSkills included
- <slug>
- learn-my-brand
- make-product-photos
- make-video-ads
- goose-ads
- goose-product-photos
- goose-video
- goose-video-local
- gooseworks
- make-custom-video
- ad-policy-check
- analyze-performance
- analyze-performance-call-and-learn
- analyze-performance-diagnose
- analyze-performance-intake
- analyze-performance-rank-and-read
- analyze-performance-revenue-join
- claims-gate
- email-lifecycle
- email-lifecycle-broadcast-planner
- email-lifecycle-flow-writer
- email-lifecycle-lifecycle-audit
- email-lifecycle-offer-math
- email-lifecycle-send-check
- honest-review
- improve-search-visibility
- improve-search-visibility-citation-check
- improve-search-visibility-entity-footprint
- improve-search-visibility-fix-writer
- improve-search-visibility-page-and-foundation-check
- improve-search-visibility-question-set
- improve-search-visibility-store-listing-audit
- make-content
- make-content-content-brief
- make-content-source-to-units
- make-content-two-pass-edit
- make-static-ads
- make-static-ads-ad-copy
- make-static-ads-claims-extract
- make-static-ads-compose
- make-static-ads-concept-grid
- make-static-ads-copy-variants
- make-static-ads-find-references
- make-static-ads-fix-rejected
- make-static-ads-graphic-request
- make-static-ads-render-review
- marketing-data-access
- marketing-guide
- outcomes-ledger
- plan-campaign
- plan-campaign-brief-and-assets
- plan-campaign-budget-and-tests
- plan-campaign-channel-decision
- plan-campaign-goal-chain
- research-audience
- research-audience-account-sourcing
- research-audience-fit-definition
- research-audience-people-and-contacts
- research-audience-score-segment-qa
- research-audience-segment-pass
- research-audience-signals-and-hooks
- research-competitors
- research-competitors-category-pass
- research-competitors-edge-cases
- research-competitors-rival-pass
- research-market
- research-market-edge-cases
- research-market-listening
- research-market-market-pass
- run-memory
- run-organic-social
- run-organic-social-account-audit
- run-organic-social-plan-calendar
- run-organic-social-platform-research
- run-organic-social-post-check
- run-paid-campaigns
- run-paid-campaigns-apply-and-log
- run-paid-campaigns-draft-moves
- run-paid-campaigns-health-gate
- run-paid-campaigns-weekly-read
- save-learning
- save-to-brain
- spend-gate
- voice-card
- where-to-start
- where-to-start-situation-save
- work-with-creators
- work-with-creators-brief-writer
- work-with-creators-creator-discovery
- work-with-creators-creator-vetting
- work-with-creators-rate-and-deal
- write-outreach
- write-outreach-draft-sequence
- write-outreach-outreach-qa
- write-outreach-reply-reader
- write-report
- ad-angle-miner
- ad-campaign-analyzer
- ad-lead-quality-analyzer
- ad-management-intake
- ads-north-star-strategy
- answer-ads-questions
- brand-research
- comment-mining
- company-contact-finder
- competitor-ad-intelligence
- get-brand-assets
- goose-graphics
- goose-graphics-create-format
- goose-graphics-create-style
- hacker-news-scraper
- job-posting-intent
- launch-meta-ad-campaign
- lead-qualification
- linkedin-profile-post-scraper
- meta-ad-manager
- meta-ad-policy-checker
- meta-ads-analyzer
- reddit-post-finder
- remix-graphic-ad-from-reference
- scrapecreators-api
- transcript-intelligence
- animate-image
- caption-burn
- compose-creator-layer
- create-apple-notes-mockup
- create-chatgpt-mockup
- create-creator-takes-h3
- create-image-fal
- create-image-gpt-image-fal
- create-imessage-mockup
- create-kinetic-typography
- create-music-elevenlabs
- create-video-fal
- create-video-seedance-2-fal
- create-vo-elevenlabs
- footage-cutlist
- media-proxy
- mix-master
- render-3d-character-explainer
- render-3d-product-showcase
- render-absurdist-explainer
- render-airdrop-carousel
- render-brand-identity-reveal
- render-cartoon-music-video
- render-cgi-sizzle
- render-chatgpt-chat
- render-cinematic-music-video
- render-cosmic-mythology-voiceover
- render-creator-pip-listicle
- render-editorial-motion-podcast
- render-flat-vector-explainer
- render-food-product-sizzle
- render-glassy-matte-grwm
- render-hand-swipe-flavor-listicle
- render-hook-replacement
- render-hypermotion
- render-ig-live-gallery
- render-imessage-chat
- render-ios-keyboard
- render-logo-equation-card
- render-model-comparison-grid
- render-mosaic-grid-reveal
- render-multiworld
- render-myth-vs-fact
- render-narrated-ugc-wardrobe-stitch
- render-offer-ad
- render-podcast-skit
- render-proof-points-overlay
- render-song-mv
- render-split-screen-creator
- render-stopmotion-hand-swatch-cycle
- render-street-interview
- render-value-prop
- render-vignette
- render-vo-anchored-motion-listicle
- render-whiteboard-explainer
- review-finished-ad
- review-ugc-render
- stitch-videos-ffmpeg
- ugc-fixloop
- verify-product-image
- video-production-harness
- watch
- write-video-ad-script
Repository facts
- License
- MIT
- Created
- Mar 2, 2026
- Last pushed
- Nov 6, 2026
- Forks
- 220
- Open issues
- 5
- Project activity
- Active
Rank over the last 12 weeks
Now #734 · best #509 · down 104 in 30 days
- #727 on Nov 2
- #731 on Nov 3
- #733 on Nov 4
- #730 on Nov 5
- #731 on Nov 6
- #734 since Nov 7
68 earlier periods
- #511 on Aug 2
- #506 on Aug 8
- #509 on Aug 9
- #522 on Aug 10
- #520 on Aug 11
- #518 on Aug 12
- #523 on Aug 13
- #522 on Aug 14
- #504 on Aug 15
- #510 on Aug 16
- #515 on Aug 17
- #527 on Aug 18
- #520 on Aug 20
- #525 on Aug 21
- #509 on Aug 22
- #534 on Aug 24
- #545 on Aug 25
- #532 on Aug 26
- #545 on Aug 28
- #520 on Aug 30
- #544 on Aug 31
- #549 on Sep 3
- #526 on Sep 5
- #548 on Sep 7
- #564 on Sep 8
- #556 on Sep 10
- #548 on Sep 11
- #543 on Sep 12
- #568 on Sep 14
- #555 on Sep 15
- #565 on Sep 16
- #556 on Sep 19
- #570 on Sep 20
- #585 on Sep 22
- #584 on Sep 23
- #566 on Sep 24
- #559 on Sep 25
- #562 on Sep 26
- #583 on Sep 27
- #611 on Sep 29
- #595 on Sep 30
- #579 on Oct 1
- #566 on Oct 3
- #580 on Oct 4
- #587 on Oct 5
- #598 on Oct 6
- #599 on Oct 7
- #630 on Oct 8
- #616 on Oct 9
- #601 on Oct 10
- #605 on Oct 11
- #621 on Oct 12
- #622 on Oct 13
- #634 on Oct 14
- #639 on Oct 16
- #612 on Oct 18
- #643 on Oct 19
- #651 on Oct 20
- #662 on Oct 21
- #643 on Oct 22
- #642 on Oct 23
- #624 on Oct 24
- #706 on Oct 25
- #712 on Oct 28
- #715 on Oct 29
- #718 on Oct 30
- #722 on Oct 31
- #724 on Nov 1
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 3, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 436 notes
scripts/build-router.js:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/build-router.js:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/entry/gooseworks/routes.json:1Analysis incomplete: Referenced executable target unavailable; not analyzeddrafts/marketing/learn-my-brand/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddrafts/marketing/learn-my-brand/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/build-router.js:1Plugin-wide analysis incomplete; see repository notesdrafts/marketing/make-video-ads/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddrafts/marketing/make-video-ads/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/build-router.js:1Plugin-wide analysis incomplete; see repository notesscripts/build-router.js:1Plugin-wide analysis incomplete; see repository notesscripts/build-router.js:1Plugin-wide analysis incomplete; see repository notesscripts/build-router.js:1Plugin-wide analysis incomplete; see repository notesscripts/build-router.js:1Plugin-wide analysis incomplete; see repository notesskills/entry/make-custom-video/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/build-router.js:1Plugin-wide analysis incomplete; see repository notesscripts/build-router.js:1Plugin-wide analysis incomplete; see repository notesscripts/build-router.js:1Plugin-wide analysis incomplete; see repository notesscripts/build-router.js:1Plugin-wide analysis incomplete; see repository notesscripts/build-router.js:1Plugin-wide analysis incomplete; see repository notesscripts/build-router.js:1Plugin-wide analysis incomplete; see repository notes
- No broad tool permissions
- 9 dangerous shell commandsin 9 files: create-chatgpt-mockup/tests/run-all.sh:8 create-imessage-mockup/tests/run-all.sh:7 mix-master/scripts/mix.sh:116 and 6 more
- 1,218 network referencesin 157 files: improve-search-visibility/references/finished-fix-examples.md:26 improve-search-visibility/tests/fixtures/coldfield.json:144 media-proxy/tests/test_media_proxy_policy.py:75 and 154 more
- 10 obfuscation signalsin 10 files: create-imessage-mockup/generate.js:44 create-vo-elevenlabs/scripts/gen_vo.py:147 render-hypermotion/scripts/PIPELINE.md:32 and 7 more
- No instruction overrides
- 312 executable scriptsin 307 files: scripts/build-router.js:1 make-static-ads/scripts/place_logo.py:1 make-static-ads/scripts/repair_patch.py:1 and 304 more
- 488 references to secretsin 66 files: caption-burn/scripts/media_proxy.py:85 create-creator-takes-h3/scripts/media_proxy.py:85 create-image-fal/scripts/media_proxy.py:85 and 63 more
- No requests to vote in Hot
Show all 2,037 signals by file
scripts/build-router.js
skills/entry/.claude-plugin/plugin.json
- Network accessline 7
"email": "goose@gooseworks.ai" }, "homepage": "https://gooseworks.ai", - Network accessline 8
}, "homepage": "https://gooseworks.ai", "repository": "https://github.com/gooseworks-ai/goose-skills", - Network accessline 9
"homepage": "https://gooseworks.ai", - Network accessline 10
"repository": "https://github.com/gooseworks-ai/goose-skills",
skills/entry/.codex-plugin/plugin.json
- Network accessline 5
"skills": "./", "author": "GooseWorks", "homepage": "https://gooseworks.ai", - Network accessline 6
"author": "GooseWorks", "homepage": "https://gooseworks.ai", "repository": "https://github.com/gooseworks-ai/goose-skills", - Network accessline 7
"homepage": "https://gooseworks.ai", - Network accessline 8
"repository": "https://github.com/gooseworks-ai/goose-skills",
skills/marketing/improve-search-visibility/references/citation-protocol.md
- Network accessline 23
**Speed.** Open the question straight in the address bar (`https://chatgpt.com/?q=<question>&hints=search`) and run several tabs side by side; the free pass is about 20–40 page reads. - Network accessline 23
**Speed.** Open the question straight in the address bar (`https://chatgpt.com/?q=<question>&hints=search`) and run several tabs side by side; the free pass is about 20–40 page reads.
skills/marketing/improve-search-visibility/references/finished-fix-examples.md
- Network accessline 26
<script type="application/ld+json"> {"@context":"https://schema.org","@type":"Product","@id":"https://halden.com/products/barrier-cream#product", - Network accessline 26
<script type="application/ld+json"> {"@context":"https://schema.org","@type":"Product","@id":"https://halden.com/products/barrier-cream#product", - Network accessline 27
{"@context":"https://schema.org","@type":"Product","@id":"https://halden.com/products/barrier-cream#product", - Network accessline 27
{"@context":"https://schema.org","@type":"Product","@id":"https://halden.com/products/barrier-cream#product", - Network accessline 28
"name":"Halden Barrier Cream","brand":{"@type":"Brand","name":"Halden"}, "description":"Fragrance-free ceramide moisturizer for sensitive, reactive skin. 3% ceramides, 5% panthenol, 50 ml.", "image":"https://halden.com/img/barrier-cream-f - Network accessline 28
"name":"Halden Barrier Cream","brand":{"@type":"Brand","name":"Halden"}, "description":"Fragrance-free ceramide moisturizer for sensitive, reactive skin. 3% ceramides, 5% panthenol, 50 ml.", "image":"https://halden.com/img/barrier-cream-f - Network accessline 29
"description":"Fragrance-free ceramide moisturizer for sensitive, reactive skin. 3% ceramides, 5% panthenol, 50 ml.", "image":"https://halden.com/img/barrier-cream-front.jpg","sku":"HLD-BC-50", "offers":{"@type":"Offer","price":"34.00","p - Network accessline 29
"description":"Fragrance-free ceramide moisturizer for sensitive, reactive skin. 3% ceramides, 5% panthenol, 50 ml.", "image":"https://halden.com/img/barrier-cream-front.jpg","sku":"HLD-BC-50", "offers":{"@type":"Offer","price":"34.00","p - Network accessline 30
"image":"https://halden.com/img/barrier-cream-front.jpg","sku":"HLD-BC-50", - Network accessline 30
"image":"https://halden.com/img/barrier-cream-front.jpg","sku":"HLD-BC-50", - Network accessline 31
"offers":{"@type":"Offer","price":"34.00","priceCurrency":"USD","availability":"https://schema.org/InStock", - Network accessline 31
"offers":{"@type":"Offer","price":"34.00","priceCurrency":"USD","availability":"https://schema.org/InStock", - Network accessline 32
"url":"https://halden.com/products/barrier-cream", - Network accessline 32
"url":"https://halden.com/products/barrier-cream", - Network accessline 33
"hasMerchantReturnPolicy":{"@type":"MerchantReturnPolicy","applicableCountry":"US", "returnPolicyCategory":"https://schema.org/MerchantReturnFiniteReturnWindow","merchantReturnDays":60, "returnFees":"https://schema.org/FreeReturn"}}} - Network accessline 33
"hasMerchantReturnPolicy":{"@type":"MerchantReturnPolicy","applicableCountry":"US", "returnPolicyCategory":"https://schema.org/MerchantReturnFiniteReturnWindow","merchantReturnDays":60, "returnFees":"https://schema.org/FreeReturn"}}} - Network accessline 34
"returnPolicyCategory":"https://schema.org/MerchantReturnFiniteReturnWindow","merchantReturnDays":60, - Network accessline 34
"returnPolicyCategory":"https://schema.org/MerchantReturnFiniteReturnWindow","merchantReturnDays":60, - Network accessline 35
"returnFees":"https://schema.org/FreeReturn"}}} - Network accessline 35
"returnFees":"https://schema.org/FreeReturn"}}} - Network accessline 42
<script type="application/ld+json"> {"@context":"https://schema.org","@type":"Organization","@id":"https://www.shiftwise.com/#organization", - Network accessline 42
<script type="application/ld+json"> {"@context":"https://schema.org","@type":"Organization","@id":"https://www.shiftwise.com/#organization", - Network accessline 43
{"@context":"https://schema.org","@type":"Organization","@id":"https://www.shiftwise.com/#organization", - Network accessline 43
{"@context":"https://schema.org","@type":"Organization","@id":"https://www.shiftwise.com/#organization", - Network accessline 44
"name":"Shiftwise","legalName":"Shiftwise Labs, Inc.","url":"https://www.shiftwise.com/", - Network accessline 44
"name":"Shiftwise","legalName":"Shiftwise Labs, Inc.","url":"https://www.shiftwise.com/", - Network accessline 45
"logo":"https://www.shiftwise.com/assets/shiftwise-logo-512.png", - Network accessline 45
"logo":"https://www.shiftwise.com/assets/shiftwise-logo-512.png", - Network accessline 47
"foundingDate":"2021-03","founder":[{"@type":"Person","name":"Maya Ortiz"}], "address":{"@type":"PostalAddress","addressLocality":"Denver","addressRegion":"CO","addressCountry":"US"}, "sameAs":["https://www.linkedin.com/company/shiftwise" - Network accessline 47
"foundingDate":"2021-03","founder":[{"@type":"Person","name":"Maya Ortiz"}], "address":{"@type":"PostalAddress","addressLocality":"Denver","addressRegion":"CO","addressCountry":"US"}, "sameAs":["https://www.linkedin.com/company/shiftwise" - Network accessline 48
"address":{"@type":"PostalAddress","addressLocality":"Denver","addressRegion":"CO","addressCountry":"US"}, "sameAs":["https://www.linkedin.com/company/shiftwise","https://www.crunchbase.com/organization/shiftwise", "https://www.g2.com/pr - Network accessline 48
"address":{"@type":"PostalAddress","addressLocality":"Denver","addressRegion":"CO","addressCountry":"US"}, "sameAs":["https://www.linkedin.com/company/shiftwise","https://www.crunchbase.com/organization/shiftwise", "https://www.g2.com/pr - Network accessline 49
"sameAs":["https://www.linkedin.com/company/shiftwise","https://www.crunchbase.com/organization/shiftwise", - Network accessline 49
"sameAs":["https://www.linkedin.com/company/shiftwise","https://www.crunchbase.com/organization/shiftwise", - Network accessline 50
"https://www.g2.com/products/shiftwise","https://www.youtube.com/@shiftwise"]} - Network accessline 50
"https://www.g2.com/products/shiftwise","https://www.youtube.com/@shiftwise"]} - Network accessline 59
| Crunchbase (claim the profile → Edit) | Short description | Staff scheduling and time-tracking software for independent restaurants. | | | Founded / HQ | March 2021 / Denver, Colorado, United States | | | Website | https://www.shiftwise.c - Network accessline 59
| Crunchbase (claim the profile → Edit) | Short description | Staff scheduling and time-tracking software for independent restaurants. | | | Founded / HQ | March 2021 / Denver, Colorado, United States | | | Website | https://www.shiftwise.c - Network accessline 60
| | Founded / HQ | March 2021 / Denver, Colorado, United States | | | Website | https://www.shiftwise.com | | G2 (vendor portal) | Product description | the canonical one-liner, then: scheduling, shift swaps, time clock, labor forecasting, - Network accessline 60
| | Founded / HQ | March 2021 / Denver, Colorado, United States | | | Website | https://www.shiftwise.com | | G2 (vendor portal) | Product description | the canonical one-liner, then: scheduling, shift swaps, time clock, labor forecasting, - Network accessline 61
| | Website | https://www.shiftwise.com | - Network accessline 61
| | Website | https://www.shiftwise.com |
skills/marketing/improve-search-visibility/references/foundation-check.md
- Network accessline 7
|---|---|---| | robots.txt | fetch `/robots.txt`; look for `Disallow` on key paths and these user agents. **Retrieval** (blocking removes you from that engine): Googlebot, Bingbot, OAI-SearchBot, ChatGPT-User, PerplexityBot, Claude-SearchBo - Network accessline 7
|---|---|---| | robots.txt | fetch `/robots.txt`; look for `Disallow` on key paths and these user agents. **Retrieval** (blocking removes you from that engine): Googlebot, Bingbot, OAI-SearchBot, ChatGPT-User, PerplexityBot, Claude-SearchBo - Network accessline 8
| robots.txt | fetch `/robots.txt`; look for `Disallow` on key paths and these user agents. **Retrieval** (blocking removes you from that engine): Googlebot, Bingbot, OAI-SearchBot, ChatGPT-User, PerplexityBot, Claude-SearchBot, Claude-User - Network accessline 8
| robots.txt | fetch `/robots.txt`; look for `Disallow` on key paths and these user agents. **Retrieval** (blocking removes you from that engine): Googlebot, Bingbot, OAI-SearchBot, ChatGPT-User, PerplexityBot, Claude-SearchBot, Claude-User - Network accessline 9
| CDN / bot management | needs a shell: `curl -A "OAI-SearchBot" -sI <url>` vs a normal browser agent (also PerplexityBot); a 403 or a challenge page means blocked. No shell → "not checked — this chat can't test bot access" and a one-line d - Network accessline 9
| CDN / bot management | needs a shell: `curl -A "OAI-SearchBot" -sI <url>` vs a normal browser agent (also PerplexityBot); a 403 or a challenge page means blocked. No shell → "not checked — this chat can't test bot access" and a one-line d - Network accessline 20
|---|---|---| | Indexed | `site:domain.com/path` (paid, counted) or Search Console URL Inspection if shared | blocker | | robots meta / X-Robots-Tag | view-source for `noindex`; `curl -sI` for the header | blocker | - Network accessline 20
|---|---|---| | Indexed | `site:domain.com/path` (paid, counted) or Search Console URL Inspection if shared | blocker | | robots meta / X-Robots-Tag | view-source for `noindex`; `curl -sI` for the header | blocker | - Network accessline 21
| Indexed | `site:domain.com/path` (paid, counted) or Search Console URL Inspection if shared | blocker | | robots meta / X-Robots-Tag | view-source for `noindex`; `curl -sI` for the header | blocker | | Status and redirects | `curl -sIL`: - Network accessline 21
| Indexed | `site:domain.com/path` (paid, counted) or Search Console URL Inspection if shared | blocker | | robots meta / X-Robots-Tag | view-source for `noindex`; `curl -sI` for the header | blocker | | Status and redirects | `curl -sIL`: - Network accessline 22
| robots meta / X-Robots-Tag | view-source for `noindex`; `curl -sI` for the header | blocker | - Network accessline 22
| robots meta / X-Robots-Tag | view-source for `noindex`; `curl -sI` for the header | blocker | - Network accessline 23
| Status and redirects | `curl -sIL`: final 200; ≤ 1 hop; 301 not 302 for permanent moves; no redirect to the homepage | blocker (4xx/5xx, loops); polish (chains) | - Network accessline 23
| Status and redirects | `curl -sIL`: final 200; ≤ 1 hop; 301 not 302 for permanent moves; no redirect to the homepage | blocker (4xx/5xx, loops); polish (chains) | - Network accessline 27
| Answer-first | the first 40–60 words under the H1 answer the question with the entity named and facts stated | polish (core AEO fix) | | Structured data | read the theme's or CMS's existing JSON-LD first (most Shopify themes already outpu - Network accessline 27
| Answer-first | the first 40–60 words under the H1 answer the question with the entity named and facts stated | polish (core AEO fix) | | Structured data | read the theme's or CMS's existing JSON-LD first (most Shopify themes already outpu - Network accessline 28
| Structured data | read the theme's or CMS's existing JSON-LD first (most Shopify themes already output Product); eligible types valid (Product/Offer, Organization, LocalBusiness, SoftwareApplication, Article, Breadcrumb); values match the - Network accessline 28
| Structured data | read the theme's or CMS's existing JSON-LD first (most Shopify themes already output Product); eligible types valid (Product/Offer, Organization, LocalBusiness, SoftwareApplication, Article, Breadcrumb); values match the - Network accessline 29
| Speed | PageSpeed Insights API `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=<url>&strategy=mobile`; use field (CrUX) data when present. Good: LCP ≤ 2.5s, INP ≤ 200ms, CLS ≤ 0.1. Poor: LCP > 4s, INP > 500ms, CLS > 0.25 ( - Network accessline 29
| Speed | PageSpeed Insights API `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=<url>&strategy=mobile`; use field (CrUX) data when present. Good: LCP ≤ 2.5s, INP ≤ 200ms, CLS ≤ 0.1. Poor: LCP > 4s, INP > 500ms, CLS > 0.25 (
skills/marketing/improve-search-visibility/references/rival-content-map.md
- Network accessline 3
Use for the requested competitor, audit or pSEO branch. It answers **what kinds of pages do the rivals have that we don't?** ("They have 12 comparison pages and 40 integration pages; you have none.") Everything here is free: sitemaps and th
skills/marketing/improve-search-visibility/skill.meta.json
- Network accessline 55
"Search Console export, app keyword field, location list, pasted AI answers — human-provided", "price history for proxy lookups — research/credits-log/<YYYY-MM>.md via the shared spend-gate atom (all proxy users)", "is there an app - Network accessline 56
"price history for proxy lookups — research/credits-log/<YYYY-MM>.md via the shared spend-gate atom (all proxy users)", "is there an app — Apple's public search lookup and the Google Play store page, via the host's fetch (public web)", - Network accessline 57
"is there an app — Apple's public search lookup and the Google Play store page, via the host's fetch (public web)", - Network accessline 58
"rivals' sitemaps and robots.txt for the page-type map; page source of the brand's homepage and one money page for analytics and ad tags — via the host's fetch (public web)",
skills/marketing/improve-search-visibility/tests/fixture-reports/gaps.json
- Network accessline 8
"query": "how to store cold brew coffee", "action": "Create useful page", "rival_url": "https://brewbench.test/guides/cold-brew-storage", - Network accessline 9
"action": "Create useful page", "rival_url": "https://brewbench.test/guides/cold-brew-storage", "position": 3, - Network accessline 10
"rival_url": "https://brewbench.test/guides/cold-brew-storage", - Network accessline 15
"query": "best beans for cold brew coffee", "action": "Create useful page", "rival_url": "https://brewbench.test/guides/best-beans-cold-brew", - Network accessline 16
"action": "Create useful page", "rival_url": "https://brewbench.test/guides/best-beans-cold-brew", "position": 4, - Network accessline 17
"rival_url": "https://brewbench.test/guides/best-beans-cold-brew", - Network accessline 22
"query": "cold brew ratio", "action": "Update existing ratio page", "rival_url": "https://brewbench.test/guides/cold-brew-ratio", - Network accessline 23
"action": "Update existing ratio page", "rival_url": "https://brewbench.test/guides/cold-brew-ratio", "position": 2, - Network accessline 24
"rival_url": "https://brewbench.test/guides/cold-brew-ratio", - Network accessline 29
"query": "decaf cold brew coffee", "action": "Create useful page", "rival_url": "https://brewbench.test/recipes/decaf-cold-brew", - Network accessline 30
"action": "Create useful page", "rival_url": "https://brewbench.test/recipes/decaf-cold-brew", "position": 6, - Network accessline 31
"rival_url": "https://brewbench.test/recipes/decaf-cold-brew", - Network accessline 36
"query": "how to dilute cold brew concentrate", "action": "Create useful page", "rival_url": "https://slowcup.test/learn/cold-brew-dilution", - Network accessline 37
"action": "Create useful page", "rival_url": "https://slowcup.test/learn/cold-brew-dilution", "position": 5, - Network accessline 38
"rival_url": "https://slowcup.test/learn/cold-brew-dilution", - Network accessline 43
"query": "iced coffee vs cold brew", "action": "Keep existing iced-coffee page", "rival_url": "https://slowcup.test/learn/iced-coffee-vs-cold-brew", - Network accessline 44
"action": "Keep existing iced-coffee page", "rival_url": "https://slowcup.test/learn/iced-coffee-vs-cold-brew", "position": 4, - Network accessline 45
"rival_url": "https://slowcup.test/learn/iced-coffee-vs-cold-brew", - Network accessline 50
"query": "cold brew latte recipe", "action": "Validate topic; no observed page-one ranking", "rival_url": "https://slowcup.test/recipes/cold-brew-latte", - Network accessline 51
"action": "Validate topic; no observed page-one ranking", "rival_url": "https://slowcup.test/recipes/cold-brew-latte", "position": null, - Network accessline 52
"rival_url": "https://slowcup.test/recipes/cold-brew-latte",
skills/marketing/improve-search-visibility/tests/fixture-reports/pseo.json
- Network accessline 56
"filter": "reusable mesh", "fit_confirmed": true, "source": "https://coldfield.test/products/brewer", - Network accessline 57
"fit_confirmed": true, "source": "https://coldfield.test/products/brewer", "method": "immersion", - Network accessline 58
"source": "https://coldfield.test/products/brewer", - Network accessline 59
"method": "immersion", "care_source": "https://coldfield.test/guides/filter-care", "source_updated": "2026-10-21" - Network accessline 60
"care_source": "https://coldfield.test/guides/filter-care", - Network accessline 68
"source": "fixture compatibility test record C2", "method": "immersion", "care_source": "https://coldfield.test/guides/filter-care", - Network accessline 69
"method": "immersion", "care_source": "https://coldfield.test/guides/filter-care", "source_updated": "2026-10-18" - Network accessline 70
"care_source": "https://coldfield.test/guides/filter-care",
skills/marketing/improve-search-visibility/tests/fixtures/coldfield.json
- Network accessline 144
{ "query": "how to store cold brew coffee", "url": "https://brewbench.test/guides/cold-brew-storage", - Network accessline 145
"query": "how to store cold brew coffee", "url": "https://brewbench.test/guides/cold-brew-storage", "position": 3, - Network accessline 146
"url": "https://brewbench.test/guides/cold-brew-storage", - Network accessline 150
{ "query": "best beans for cold brew coffee", "url": "https://brewbench.test/guides/best-beans-cold-brew", - Network accessline 151
"query": "best beans for cold brew coffee", "url": "https://brewbench.test/guides/best-beans-cold-brew", "position": 4, - Network accessline 152
"url": "https://brewbench.test/guides/best-beans-cold-brew", - Network accessline 156
{ "query": "cold brew ratio", "url": "https://brewbench.test/guides/cold-brew-ratio", - Network accessline 157
"query": "cold brew ratio", "url": "https://brewbench.test/guides/cold-brew-ratio", "position": 2, - Network accessline 158
"url": "https://brewbench.test/guides/cold-brew-ratio", - Network accessline 162
{ "query": "decaf cold brew coffee", "url": "https://brewbench.test/recipes/decaf-cold-brew", - Network accessline 163
"query": "decaf cold brew coffee", "url": "https://brewbench.test/recipes/decaf-cold-brew", "position": 6, - Network accessline 164
"url": "https://brewbench.test/recipes/decaf-cold-brew", - Network accessline 177
{ "query": "how to dilute cold brew concentrate", "url": "https://slowcup.test/learn/cold-brew-dilution", - Network accessline 178
"query": "how to dilute cold brew concentrate", "url": "https://slowcup.test/learn/cold-brew-dilution", "position": 5, - Network accessline 179
"url": "https://slowcup.test/learn/cold-brew-dilution", - Network accessline 183
{ "query": "iced coffee vs cold brew", "url": "https://slowcup.test/learn/iced-coffee-vs-cold-brew", - Network accessline 184
"query": "iced coffee vs cold brew", "url": "https://slowcup.test/learn/iced-coffee-vs-cold-brew", "position": 4, - Network accessline 185
"url": "https://slowcup.test/learn/iced-coffee-vs-cold-brew", - Network accessline 189
{ "query": "cold brew latte recipe", "url": "https://slowcup.test/recipes/cold-brew-latte", - Network accessline 190
"query": "cold brew latte recipe", "url": "https://slowcup.test/recipes/cold-brew-latte", "position": null, - Network accessline 191
"url": "https://slowcup.test/recipes/cold-brew-latte", - Network accessline 206
"subject_research": [ { "source": "https://brewbench.test/guides/cold-brew-ratio", - Network accessline 207
{ "source": "https://brewbench.test/guides/cold-brew-ratio", "observed": "Concentrate vs ready-to-drink are related ratio intents; dilution is a separate serving task" - Network accessline 208
"source": "https://brewbench.test/guides/cold-brew-ratio", - Network accessline 210
}, { "source": "https://brewbench.test/guides/best-beans-cold-brew", - Network accessline 211
{ "source": "https://brewbench.test/guides/best-beans-cold-brew", "observed": "Bean roast and grind are selection/preparation decisions" - Network accessline 212
"source": "https://brewbench.test/guides/best-beans-cold-brew", - Network accessline 214
}, { "source": "https://brewbench.test/guides/cold-brew-storage", - Network accessline 215
{ "source": "https://brewbench.test/guides/cold-brew-storage", "observed": "Storage/container questions distinct from brewing method; do not invent safety durations" - Network accessline 216
"source": "https://brewbench.test/guides/cold-brew-storage", - Network accessline 218
}, { "source": "https://coldfield.test/blog/cold-brew-too-bitter", - Network accessline 219
{ "source": "https://coldfield.test/blog/cold-brew-too-bitter", "observed": "Troubleshooting bitterness and weak brew belongs under extraction troubleshooting" - Network accessline 220
"source": "https://coldfield.test/blog/cold-brew-too-bitter", - Network accessline 247
"filter": "reusable mesh", "fit_confirmed": true, "source": "https://coldfield.test/products/brewer", - Network accessline 248
"fit_confirmed": true, "source": "https://coldfield.test/products/brewer", "method": "immersion", - Network accessline 249
"source": "https://coldfield.test/products/brewer", - Network accessline 250
"method": "immersion", "care_source": "https://coldfield.test/guides/filter-care", "source_updated": "2026-10-21" - Network accessline 251
"care_source": "https://coldfield.test/guides/filter-care", - Network accessline 259
"source": "fixture compatibility test record C2", "method": "immersion", "care_source": "https://coldfield.test/guides/filter-care", - Network accessline 260
"method": "immersion", "care_source": "https://coldfield.test/guides/filter-care", "source_updated": "2026-10-18" - Network accessline 261
"care_source": "https://coldfield.test/guides/filter-care",
skills/marketing/improve-search-visibility/tests/run-fixtures.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/marketing/improve-search-visibility/tests/test-by-hand.md
- Network accessline 53
| Last run | `file_list` `search/` in the coworker workspace | empty → first run | | Page list (free) | `knowledge_import` `website: {action: discover}` | 25 pages listed, `provider_requests: 0` (free): collections, product pages, About, FA - Network accessline 54
| Page list (free) | `knowledge_import` `website: {action: discover}` | 25 pages listed, `provider_requests: 0` (free): collections, product pages, About, FAQ. **Added to the page-and-foundation atom as the free way to find the pages behind - Network accessline 55
| Foundation, site-wide (host shell, free) | `curl robots.txt`; homepage as OAI-SearchBot / PerplexityBot / browser | Shopify robots; no AI search or training bot blocked; all three agents get 200 (no CDN blocking); sitemap declared; canoni
skills/marketing/make-static-ads/scripts/README.md
- Network accessline 20
python3 template_sheet.py ad1-templates.jpg --title "Ad 1 · balanced" "A (chosen): your bundle ad, graphic=https://…/a.png" "B: library, lifestyle=https://…/b.jpg" "C: library, 3D=https://…/c.png" - Network accessline 21
python3 template_sheet.py ad1-based-on.jpg --no-chosen "Based on: your bundle ad=https://…/a.png" "Finished ad=ad1-logo.png"
skills/marketing/make-static-ads/scripts/place_logo.py
skills/marketing/make-static-ads/scripts/repair_patch.py
skills/marketing/make-static-ads/scripts/template_sheet.py
- Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 4
Usage: python3 template_sheet.py out.jpg --title "Ad 1 · balanced · No sink required" \ "A (chosen): your bundle ad=https://…/a.png" "B: library, lifestyle=https://…/b.jpg" "C: library, 3D=c.png" - Network accessline 4
Usage: python3 template_sheet.py out.jpg --title "Ad 1 · balanced · No sink required" \ "A (chosen): your bundle ad=https://…/a.png" "B: library, lifestyle=https://…/b.jpg" "C: library, 3D=c.png" - Network accessline 5
python3 template_sheet.py out.jpg --title "Ad 1 · balanced · No sink required" "A (chosen): your bundle ad=https://…/a.png" "B: library, lifestyle=https://…/b.jpg" "C: library, 3D=c.png" - Network accessline 5
python3 template_sheet.py out.jpg --title "Ad 1 · balanced · No sink required" "A (chosen): your bundle ad=https://…/a.png" "B: library, lifestyle=https://…/b.jpg" "C: library, 3D=c.png" - Network accessline 6
"A (chosen): your bundle ad=https://…/a.png" "B: library, lifestyle=https://…/b.jpg" "C: library, 3D=c.png" - Network accessline 6
"A (chosen): your bundle ad=https://…/a.png" "B: library, lifestyle=https://…/b.jpg" "C: library, 3D=c.png" - Network accessline 28
def load(source): if source.startswith(("http://", "https://")): req = urllib.request.Request(source, headers={"User-Agent": "make-static-ads/template_sheet"}) - Network accessline 28
def load(source): if source.startswith(("http://", "https://")): req = urllib.request.Request(source, headers={"User-Agent": "make-static-ads/template_sheet"}) - Network accessline 29
if source.startswith(("http://", "https://")): req = urllib.request.Request(source, headers={"User-Agent": "make-static-ads/template_sheet"}) with urllib.request.urlopen(req, timeout=30) as r: - Network accessline 29
if source.startswith(("http://", "https://")): req = urllib.request.Request(source, headers={"User-Agent": "make-static-ads/template_sheet"}) with urllib.request.urlopen(req, timeout=30) as r: - Network accessline 30
req = urllib.request.Request(source, headers={"User-Agent": "make-static-ads/template_sheet"}) - Network accessline 30
req = urllib.request.Request(source, headers={"User-Agent": "make-static-ads/template_sheet"}) - Network accessline 31
with urllib.request.urlopen(req, timeout=30) as r: - Network accessline 31
with urllib.request.urlopen(req, timeout=30) as r:
skills/marketing/make-static-ads/tests/test_place_logo.py
- Executable scriptline 1
Executable file
skills/marketing/make-static-ads/tests/test_repair_patch.py
- Executable scriptline 1
Executable file
skills/marketing/make-static-ads/tests/test_template_sheet.py
- Executable scriptline 1
Executable file - Network accessline 29
def test_parse_tile_keeps_query_in_url(self): self.assertEqual(template_sheet.parse_tile("B: library=https://e.com/a.jpg?v=17"), ("B: library", "https://e.com/a.jpg?v=17")) - Network accessline 30
self.assertEqual(template_sheet.parse_tile("B: library=https://e.com/a.jpg?v=17"), ("B: library", "https://e.com/a.jpg?v=17"))
skills/marketing/marketing-data-access/SKILL.md
- Network accessline 56
Use these first, with the host's own fetch, including in scheduled runs that have no browser: - **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at - Network accessline 56
Use these first, with the host's own fetch, including in scheduled runs that have no browser: - **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at - Network accessline 56
Use these first, with the host's own fetch, including in scheduled runs that have no browser: - **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at - Network accessline 56
Use these first, with the host's own fetch, including in scheduled runs that have no browser: - **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at - Network accessline 56
Use these first, with the host's own fetch, including in scheduled runs that have no browser: - **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at - Network accessline 56
Use these first, with the host's own fetch, including in scheduled runs that have no browser: - **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at - Network accessline 56
Use these first, with the host's own fetch, including in scheduled runs that have no browser: - **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at - Network accessline 56
Use these first, with the host's own fetch, including in scheduled runs that have no browser: - **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at - Network accessline 57
- **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at_i><unix>` for recent) for launches, developer chatter and B2B buying signals. - Network accessline 57
- **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at_i><unix>` for recent) for launches, developer chatter and B2B buying signals. - Network accessline 57
- **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at_i><unix>` for recent) for launches, developer chatter and B2B buying signals. - Network accessline 57
- **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at_i><unix>` for recent) for launches, developer chatter and B2B buying signals. - Network accessline 57
- **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at_i><unix>` for recent) for launches, developer chatter and B2B buying signals. - Network accessline 57
- **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at_i><unix>` for recent) for launches, developer chatter and B2B buying signals. - Network accessline 57
- **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at_i><unix>` for recent) for launches, developer chatter and B2B buying signals. - Network accessline 57
- **Hacker News:** the public Algolia search API (`https://hn.algolia.com/api/v1/search?query=<terms>&tags=story`, add `&numericFilters=created_at_i><unix>` for recent) for launches, developer chatter and B2B buying signals. - Access to secretsline 69
[Credential-related source omitted] - Access to secretsline 69
[Credential-related source omitted] - Access to secretsline 69
[Credential-related source omitted] - Access to secretsline 69
[Credential-related source omitted] - Access to secretsline 69
[Credential-related source omitted] - Access to secretsline 69
[Credential-related source omitted] - Access to secretsline 69
[Credential-related source omitted] - Access to secretsline 69
[Credential-related source omitted]
skills/marketing/research-audience/references/list-sources.md
- Network accessline 39
The top two queries per kind (18 searches), more only for the kinds that return buyers. One lookback: 30 days (90 for rivals' launches and case studies). **Hacker News** (free, no key): the public search API's by-date endpoint, `https://hn. - Network accessline 39
The top two queries per kind (18 searches), more only for the kinds that return buyers. One lookback: 30 days (90 for rivals' launches and case studies). **Hacker News** (free, no key): the public search API's by-date endpoint, `https://hn. - Network accessline 39
The top two queries per kind (18 searches), more only for the kinds that return buyers. One lookback: 30 days (90 for rivals' launches and case studies). **Hacker News** (free, no key): the public search API's by-date endpoint, `https://hn.
skills/marketing/research-competitors/references/reading-ads-honestly.md
- Network accessline 15
The link for a Meta ad is `https://www.facebook.com/ads/library/?id=<ad id>`. Put it on every ad you cite. The server sample covers all countries — say "server sample, all countries". For browser or paid full reads, set the library's countr
skills/marketing/research-competitors/references/rival-craft.md
- Network accessline 53
**Wayback Machine, efficiently:** list only the dates a page actually changed — `https://web.archive.org/cdx/search/cdx?url=<page>&output=json&collapse=digest&from=<YYYYMM>` — then fetch just those snapshots raw, without the archive toolbar - Network accessline 53
**Wayback Machine, efficiently:** list only the dates a page actually changed — `https://web.archive.org/cdx/search/cdx?url=<page>&output=json&collapse=digest&from=<YYYYMM>` — then fetch just those snapshots raw, without the archive toolbar
skills/marketing/research-competitors/references/watch-and-react.md
- Network accessline 14
7. **Reviews and community:** new complaint or praise themes; spikes. 8. **Search and AI answers:** the category pass's prompts, if anything moved. 9. **Free feeds** (what a scheduled run, with no browser, can still read): each rival's blog - Network accessline 15
8. **Search and AI answers:** the category pass's prompts, if anything moved. 9. **Free feeds** (what a scheduled run, with no browser, can still read): each rival's blog and changelog feed, diffed since the last snapshot (the `<link rel="a - Network accessline 16
9. **Free feeds** (what a scheduled run, with no browser, can still read): each rival's blog and changelog feed, diffed since the last snapshot (the `<link rel="alternate" type="application/rss+xml">` in the page head, else `/feed`, `/rss`,
skills/marketing/research-competitors/tests/examples/2026-10-22/engagement-report.md
- Network accessline 18
| Supplied post | Published | Reactions | Comments | Coverage | |---|---|---|---|---| | [Review post](https://www.linkedin.com/posts/billpilot_review-activity-101/) | 10 Oct | 220 | 12 | Supplied post only | - Network accessline 19
|---|---|---|---|---| | [Review post](https://www.linkedin.com/posts/billpilot_review-activity-101/) | 10 Oct | 220 | 12 | Supplied post only | | [Export post](https://www.linkedin.com/posts/billpilot_export-activity-102/) | 12 Oct | 110 | - Network accessline 20
| [Review post](https://www.linkedin.com/posts/billpilot_review-activity-101/) | 10 Oct | 220 | 12 | Supplied post only | - Network accessline 21
| [Export post](https://www.linkedin.com/posts/billpilot_export-activity-102/) | 12 Oct | 110 | 8 | Supplied post only |
skills/marketing/research-competitors/tests/examples/2026-10-22/engagers.csv
- Network accessline 1
profile_url,name,headline,company,source_post_url,post_date,engagement_type,comment_text,engagement_date,retrieved_date,method,evidence_status,fit_reason https://www.linkedin.com/in/nila-fixture/,Nila Rao,Controller,Seabank Parts,https://ww - Network accessline 2
https://www.linkedin.com/in/nila-fixture/,Nila Rao,Controller,Seabank Parts,https://www.linkedin.com/posts/billpilot_review-activity-101/,2026-10-10,comment,"I need to see who decided, not another score",2026-10-11,2026-10-22,supplied-expor - Network accessline 3
https://www.linkedin.com/in/alex-one-fixture/,Alex Chen,AP lead,Orchard Parts,https://www.linkedin.com/posts/billpilot_review-activity-101/,2026-10-10,comment,Does this export the reviewer decision?,2026-10-11,2026-10-22,supplied-export,sup - Network accessline 4
https://www.linkedin.com/in/alex-two-fixture/,Alex Chen,Marketing manager,Peak Retail,https://www.linkedin.com/posts/billpilot_export-activity-102/,2026-10-12,reaction,,,2026-10-22,supplied-export,supplied export; title unverified; engageme - Network accessline 5
https://www.linkedin.com/in/nila-fixture/,Nila Rao,Controller,Seabank Parts,https://www.linkedin.com/posts/billpilot_review-activity-101/,2026-10-10,reaction,,2026-10-11,2026-10-22,supplied-export,supplied export; title unverified; dated en - Network accessline 6
https://www.linkedin.com/in/csv-fixture/,Ira Vale,Controller,Stone Retail,https://www.linkedin.com/posts/billpilot_export-activity-102/,2026-10-12,comment,'=SUM(1+1),2026-10-13,2026-10-22,supplied-export,supplied export; title unverified; d
skills/marketing/research-competitors/tests/examples/2026-10-22/excluded.csv
- Network accessline 1
profile_url,name,headline,company,source_post_url,post_date,engagement_type,comment_text,engagement_date,retrieved_date,method,exclusion_reason https://www.linkedin.com/in/nila-fixture/,Nila Rao,Controller,Seabank Parts,https://www.linkedin - Network accessline 2
https://www.linkedin.com/in/nila-fixture/,Nila Rao,Controller,Seabank Parts,https://www.linkedin.com/posts/billpilot_review-activity-101/,2026-10-10,comment,"I need to see who decided, not another score",2026-10-11,2026-10-22,supplied-expor - Network accessline 3
https://www.linkedin.com/in/seller-staff-fixture/,Sam Lee,Product lead,BillPilot,https://www.linkedin.com/posts/billpilot_export-activity-102/,2026-10-12,reaction,,2026-10-13,2026-10-22,supplied-export,"rival staff, supplied export" - Network accessline 4
,Unknown,,Unknown,https://www.linkedin.com/posts/billpilot_export-activity-102/,2026-10-12,reaction,,2026-10-13,2026-10-22,supplied-export,missing profile URL - Network accessline 5
https://www.linkedin.com/in/outside-fixture/,Terry Lane,Controller,Harbour Parts,https://www.linkedin.com/posts/other_post-activity-999/,2026-10-12,comment,Looks useful,2026-10-13,2026-10-22,supplied-export,not a selected source post
skills/marketing/research-competitors/tests/fixtures/engagers.csv
- Network accessline 1
profile_url,name,headline,company,source_post_url,post_date,engagement_type,comment_text,engagement_date,retrieved_date,method https://www.linkedin.com/in/nila-fixture/,Nila Rao,Controller,Seabank Parts,https://www.linkedin.com/posts/billpi - Network accessline 2
https://www.linkedin.com/in/nila-fixture/,Nila Rao,Controller,Seabank Parts,https://www.linkedin.com/posts/billpilot_review-activity-101/,2026-10-10,comment,"I need to see who decided, not another score",2026-10-11,2026-10-22,supplied-expor - Network accessline 3
https://www.linkedin.com/in/alex-one-fixture/,Alex Chen,AP lead,Orchard Parts,https://www.linkedin.com/posts/billpilot_review-activity-101/,2026-10-10,comment,"Does this export the reviewer decision?",2026-10-11,2026-10-22,supplied-export - Network accessline 4
https://www.linkedin.com/in/alex-two-fixture/,Alex Chen,Marketing manager,Peak Retail,https://www.linkedin.com/posts/billpilot_export-activity-102/,2026-10-12,reaction,,,2026-10-22,supplied-export - Network accessline 5
https://www.linkedin.com/in/nila-fixture/,Nila Rao,Controller,Seabank Parts,https://www.linkedin.com/posts/billpilot_review-activity-101/,2026-10-10,reaction,,2026-10-11,2026-10-22,supplied-export - Network accessline 6
https://www.linkedin.com/in/nila-fixture/,Nila Rao,Controller,Seabank Parts,https://www.linkedin.com/posts/billpilot_review-activity-101/,2026-10-10,comment,"I need to see who decided, not another score",2026-10-11,2026-10-22,supplied-expor - Network accessline 7
https://www.linkedin.com/in/seller-staff-fixture/,Sam Lee,Product lead,BillPilot,https://www.linkedin.com/posts/billpilot_export-activity-102/,2026-10-12,reaction,,2026-10-13,2026-10-22,supplied-export - Network accessline 8
,Unknown,,Unknown,https://www.linkedin.com/posts/billpilot_export-activity-102/,2026-10-12,reaction,,2026-10-13,2026-10-22,supplied-export - Network accessline 9
https://www.linkedin.com/in/outside-fixture/,Terry Lane,Controller,Harbour Parts,https://www.linkedin.com/posts/other_post-activity-999/,2026-10-12,comment,Looks useful,2026-10-13,2026-10-22,supplied-export - Network accessline 10
https://www.linkedin.com/in/csv-fixture/,Ira Vale,Controller,Stone Retail,https://www.linkedin.com/posts/billpilot_export-activity-102/,2026-10-12,comment,=SUM(1+1),2026-10-13,2026-10-22,supplied-export
skills/marketing/research-competitors/tests/fixtures/focused-evidence.md
- Network accessline 31
Company: BillPilot. Requested window: posts published 1–22 Oct; engagement dates are not the filter. Post https://www.linkedin.com/posts/billpilot_review-activity-101/ was published 10 Oct; 220 reactions and 12 comments. Post https://www.li
skills/marketing/research-competitors/tests/fixtures/page-source.html
- Network accessline 1
<!doctype html> <html><head><meta name="generator" content="Webflow"> <script src="https://www.googletagmanager.com/gtm.js?id=GTM-FIXTURE"></script> - Network accessline 2
<html><head><meta name="generator" content="Webflow"> <script src="https://www.googletagmanager.com/gtm.js?id=GTM-FIXTURE"></script> <script src="https://connect.facebook.net/en_US/fbevents.js"></script> - Network accessline 3
<script src="https://www.googletagmanager.com/gtm.js?id=GTM-FIXTURE"></script> - Network accessline 4
<script src="https://connect.facebook.net/en_US/fbevents.js"></script> - Network accessline 5
<script src="https://eu.i.posthog.com/static/array.js"></script> - Network accessline 6
<!-- Historical, inactive draft: <script src="https://snap.licdn.com/li.lms-analytics/insight.min.js"></script> -->
skills/marketing/research-market-edge-cases/SKILL.md
- Network accessline 11
- **No browser at all** (hosted chat, a scheduled run): use search results, the pages fetch can read, and the free server reads (`brand_read` `organic`, `gooseworks:social_inspiration_search`). Say once, in the report's "In short", what cou - Network accessline 11
- **No browser at all** (hosted chat, a scheduled run): use search results, the pages fetch can read, and the free server reads (`brand_read` `organic`, `gooseworks:social_inspiration_search`). Say once, in the report's "In short", what cou - Network accessline 12
- **The browser waits on the founder's approval, or keeps asking:** tell them in one line what it is for, then finish the same reads with search and fetch (`site:` queries, each post's own link) — first-hand evidence such as the brand's own - Network accessline 12
- **The browser waits on the founder's approval, or keeps asking:** tell them in one line what it is for, then finish the same reads with search and fetch (`site:` queries, each post's own link) — first-hand evidence such as the brand's own
skills/marketing/research-market/references/listening-craft.md
- Network accessline 30
- **Counts from the free pass are samples** — say so. Week-over-week or month-over-month change only when both runs used the same method and query set. - **Paid top-up** (bulk reads through `../../spend-gate/proxy-endpoints.md` (in the `spe - Network accessline 30
- **Counts from the free pass are samples** — say so. Week-over-week or month-over-month change only when both runs used the same method and query set. - **Paid top-up** (bulk reads through `../../spend-gate/proxy-endpoints.md` (in the `spe - Network accessline 31
- **Paid top-up** (bulk reads through `../../spend-gate/proxy-endpoints.md` (in the `spend-gate` skill), one yes): full counts per platform, comments on the top posts, author baselines, platforms behind logins. Caps for a first plan: ≤3 pag - Network accessline 31
- **Paid top-up** (bulk reads through `../../spend-gate/proxy-endpoints.md` (in the `spend-gate` skill), one yes): full counts per platform, comments on the top posts, author baselines, platforms behind logins. Caps for a first plan: ≤3 pag - Network accessline 32
- **Free feeds a plain fetch can read** (and a scheduled run, which has no browser): Hacker News search for B2B and developer brands — `https://hn.algolia.com/api/v1/search_by_date?query=<terms>&tags=story` (or `comment`, `show_hn`, `ask_hn - Network accessline 32
- **Free feeds a plain fetch can read** (and a scheduled run, which has no browser): Hacker News search for B2B and developer brands — `https://hn.algolia.com/api/v1/search_by_date?query=<terms>&tags=story` (or `comment`, `show_hn`, `ask_hn
skills/marketing/spend-gate/proxy-endpoints.md
- Network accessline 88
| TikTok Shop product reviews | `/v1/tiktok/shop/product/reviews` (`url` or `product_id`, `region`, `page`) | paid | | Trustpilot (the brand's own confirmed profile only) | `gooseworks:knowledge_sync` | `max_reviews` 1–50 per import; `max_s - Network accessline 88
| TikTok Shop product reviews | `/v1/tiktok/shop/product/reviews` (`url` or `product_id`, `region`, `page`) | paid | | Trustpilot (the brand's own confirmed profile only) | `gooseworks:knowledge_sync` | `max_reviews` 1–50 per import; `max_s - Network accessline 88
| TikTok Shop product reviews | `/v1/tiktok/shop/product/reviews` (`url` or `product_id`, `region`, `page`) | paid | | Trustpilot (the brand's own confirmed profile only) | `gooseworks:knowledge_sync` | `max_reviews` 1–50 per import; `max_s - Network accessline 90
| Amazon, App Store / Play, G2, Capterra, Google Business, Yelp, on-site review widgets | no proxy route | host browser or fetch (labelled), or the user pastes | - Network accessline 90
| Amazon, App Store / Play, G2, Capterra, Google Business, Yelp, on-site review widgets | no proxy route | host browser or fetch (labelled), or the user pastes | - Network accessline 90
| Amazon, App Store / Play, G2, Capterra, Google Business, Yelp, on-site review widgets | no proxy route | host browser or fetch (labelled), or the user pastes | - Network accessline 104
Generic web page fetch, web search beyond `/v1/google/search` results, search-interest/Trends, keyword volume, app-store reviews, Amazon reviews. Use the host's own browser or fetch (label rows `read-by-fetch`), a shell `curl` of a public p - Network accessline 104
Generic web page fetch, web search beyond `/v1/google/search` results, search-interest/Trends, keyword volume, app-store reviews, Amazon reviews. Use the host's own browser or fetch (label rows `read-by-fetch`), a shell `curl` of a public p - Network accessline 104
Generic web page fetch, web search beyond `/v1/google/search` results, search-interest/Trends, keyword volume, app-store reviews, Amazon reviews. Use the host's own browser or fetch (label rows `read-by-fetch`), a shell `curl` of a public p
skills/marketing/voice-card/tests/examples/2026-10-22/blog-voice.md
- Network accessline 13
| Article | Author (supplied company staff) | Published | Body words | Sentences | |---|---|---|---|---| | [Name the exception before you route it](https://papertrail.example/blog/article-1) | Mira Patel | 1 Oct | 177 | 17 | - Network accessline 14
|---|---|---|---|---| | [Name the exception before you route it](https://papertrail.example/blog/article-1) | Mira Patel | 1 Oct | 177 | 17 | | [An export needs a reader](https://papertrail.example/blog/article-2) | Mira Patel | 3 Oct | 180 - Network accessline 15
| [Name the exception before you route it](https://papertrail.example/blog/article-1) | Mira Patel | 1 Oct | 177 | 17 | - Network accessline 16
| [An export needs a reader](https://papertrail.example/blog/article-2) | Mira Patel | 3 Oct | 180 | 17 | - Network accessline 17
| [What a handover note should hold](https://papertrail.example/blog/article-3) | Jon Ellis | 5 Oct | 179 | 16 | - Network accessline 18
| [Keep a review separate from an approval](https://papertrail.example/blog/article-4) | Jon Ellis | 7 Oct | 180 | 17 | - Network accessline 19
| [Read the record before changing the process](https://papertrail.example/blog/article-5) | Mira Patel | 9 Oct | 182 | 18 |
skills/marketing/voice-card/tests/fixtures/company-blog.md
- Network accessline 5
<!-- article:1 --> # Name the exception before you route it Source: https://papertrail.example/blog/article-1 - Network accessline 6
# Name the exception before you route it Source: https://papertrail.example/blog/article-1 Author: Mira Patel (company staff, supplied metadata) · Published: 2026-10-01 · Retrieved: 2026-10-22 - Network accessline 7
Source: https://papertrail.example/blog/article-1 - Network accessline 23
<!-- article:2 --> # An export needs a reader Source: https://papertrail.example/blog/article-2 - Network accessline 24
# An export needs a reader Source: https://papertrail.example/blog/article-2 Author: Mira Patel (company staff, supplied metadata) · Published: 2026-10-03 · Retrieved: 2026-10-22 - Network accessline 25
Source: https://papertrail.example/blog/article-2 - Network accessline 41
<!-- article:3 --> # What a handover note should hold Source: https://papertrail.example/blog/article-3 - Network accessline 42
# What a handover note should hold Source: https://papertrail.example/blog/article-3 Author: Jon Ellis (company staff, supplied metadata) · Published: 2026-10-05 · Retrieved: 2026-10-22 - Network accessline 43
Source: https://papertrail.example/blog/article-3 - Network accessline 59
<!-- article:4 --> # Keep a review separate from an approval Source: https://papertrail.example/blog/article-4 - Network accessline 60
# Keep a review separate from an approval Source: https://papertrail.example/blog/article-4 Author: Jon Ellis (company staff, supplied metadata) · Published: 2026-10-07 · Retrieved: 2026-10-22 - Network accessline 61
Source: https://papertrail.example/blog/article-4 - Network accessline 77
<!-- article:5 --> # Read the record before changing the process Source: https://papertrail.example/blog/article-5 - Network accessline 78
# Read the record before changing the process Source: https://papertrail.example/blog/article-5 Author: Mira Patel (company staff, supplied metadata) · Published: 2026-10-09 · Retrieved: 2026-10-22 - Network accessline 79
Source: https://papertrail.example/blog/article-5
skills/marketing/write-report/SKILL.md
- Network accessline 41
**Language:** plain words, short sentences, active voice; one idea per paragraph; bullets, tables for comparisons, **bold** on what matters. Every fact carries a date and a link, inline: "Loxo starts at $149/user/month ([pricing](https://…) - Network accessline 41
**Language:** plain words, short sentences, active voice; one idea per paragraph; bullets, tables for comparisons, **bold** on what matters. Every fact carries a date and a link, inline: "Loxo starts at $149/user/month ([pricing](https://…) - Network accessline 41
**Language:** plain words, short sentences, active voice; one idea per paragraph; bullets, tables for comparisons, **bold** on what matters. Every fact carries a date and a link, inline: "Loxo starts at $149/user/month ([pricing](https://…) - Network accessline 41
**Language:** plain words, short sentences, active voice; one idea per paragraph; bullets, tables for comparisons, **bold** on what matters. Every fact carries a date and a link, inline: "Loxo starts at $149/user/month ([pricing](https://…) - Network accessline 41
**Language:** plain words, short sentences, active voice; one idea per paragraph; bullets, tables for comparisons, **bold** on what matters. Every fact carries a date and a link, inline: "Loxo starts at $149/user/month ([pricing](https://…) - Network accessline 41
**Language:** plain words, short sentences, active voice; one idea per paragraph; bullets, tables for comparisons, **bold** on what matters. Every fact carries a date and a link, inline: "Loxo starts at $149/user/month ([pricing](https://…) - Network accessline 41
**Language:** plain words, short sentences, active voice; one idea per paragraph; bullets, tables for comparisons, **bold** on what matters. Every fact carries a date and a link, inline: "Loxo starts at $149/user/month ([pricing](https://…) - Network accessline 41
**Language:** plain words, short sentences, active voice; one idea per paragraph; bullets, tables for comparisons, **bold** on what matters. Every fact carries a date and a link, inline: "Loxo starts at $149/user/month ([pricing](https://…) - Network accessline 41
**Language:** plain words, short sentences, active voice; one idea per paragraph; bullets, tables for comparisons, **bold** on what matters. Every fact carries a date and a link, inline: "Loxo starts at $149/user/month ([pricing](https://…) - Network accessline 41
**Language:** plain words, short sentences, active voice; one idea per paragraph; bullets, tables for comparisons, **bold** on what matters. Every fact carries a date and a link, inline: "Loxo starts at $149/user/month ([pricing](https://…) - Network accessline 41
**Language:** plain words, short sentences, active voice; one idea per paragraph; bullets, tables for comparisons, **bold** on what matters. Every fact carries a date and a link, inline: "Loxo starts at $149/user/month ([pricing](https://…) - Network accessline 41
**Language:** plain words, short sentences, active voice; one idea per paragraph; bullets, tables for comparisons, **bold** on what matters. Every fact carries a date and a link, inline: "Loxo starts at $149/user/month ([pricing](https://…) - Network accessline 41
**Language:** plain words, short sentences, active voice; one idea per paragraph; bullets, tables for comparisons, **bold** on what matters. Every fact carries a date and a link, inline: "Loxo starts at $149/user/month ([pricing](https://…)
skills/shared/ad-angle-miner/SKILL.md
- Executable scriptline 1
Executable file
skills/shared/ad-angle-miner/references/video-handoff.md
- Network accessline 44
"facts": [ {"id": "f1", "product_id": "product-bottle", "text": "A screw-top lid", "source": "https://example.com/product", "verified_at": "2026-10-02"} - Network accessline 45
{"id": "f1", "product_id": "product-bottle", "text": "A screw-top lid", "source": "https://example.com/product", "verified_at": "2026-10-02"} ], - Network accessline 46
"source": "https://example.com/product", "verified_at": "2026-10-02"} - Network accessline 48
"quotes": [ {"id": "q1", "text": "I keep my drink in a separate pocket", "source": "https://example.com/review", "scope": "category", "tag": "moment"} - Network accessline 49
{"id": "q1", "text": "I keep my drink in a separate pocket", "source": "https://example.com/review", "scope": "category", "tag": "moment"} ], - Network accessline 50
"source": "https://example.com/review", "scope": "category", "tag": "moment"} - Network accessline 51
], "references": [ {"id": "r1", "source": "https://example.com/ad", "kind": "paid", - Network accessline 52
"references": [ {"id": "r1", "source": "https://example.com/ad", "kind": "paid", "observation": "Shows the closure before a packing scene", - Network accessline 53
{"id": "r1", "source": "https://example.com/ad", "kind": "paid",
skills/shared/ad-campaign-analyzer/SKILL.md
- Executable scriptline 1
Executable file
skills/shared/brand-research/.env.example
- Access to secretsline 1
[Credential-related source omitted] - Network accessline 8
# FAL — only needed for render_product_shot.py (nano-banana image generation). # Get one at https://fal.ai/dashboard/keys - Network accessline 9
# Get one at https://fal.ai/dashboard/keys - Network accessline 12
# ElevenLabs — only needed if you extract an audio bed from an existing ad as a # tone reference. Get one at https://elevenlabs.io/app/settings/api-keys - Network accessline 13
# tone reference. Get one at https://elevenlabs.io/app/settings/api-keys - Access to secretsline 14
[Credential-related source omitted]
skills/shared/brand-research/README.md
skills/shared/brand-research/examples/notion-calendar-with-ads.md
- Network accessline 6
Research Notion (product: Notion Calendar, https://notion.so/product/calendar)
skills/shared/brand-research/examples/oatly-oat-milk.md
- Network accessline 6
Research the brand Oatly (product: Oat Milk, https://www.oatly.com)
skills/shared/brand-research/scripts/fetch_asset.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 5
Usage: python scripts/fetch_asset.py --brand-dir ./acme \ --url https://acme.com/press/logo.svg \ - Network accessline 6
python scripts/fetch_asset.py --brand-dir ./acme --url https://acme.com/press/logo.svg - Network accessline 7
--url https://acme.com/press/logo.svg \ - Network accessline 32
def download(url: str, dest: pathlib.Path, tries: int = 3) -> None: req = urllib.request.Request(url, headers={"User-Agent": "gooseworks-ads/brand-research"}) - Network accessline 33
req = urllib.request.Request(url, headers={"User-Agent": "gooseworks-ads/brand-research"}) - Network accessline 35
for attempt in range(1, tries + 1): try: with urllib.request.urlopen(req, timeout=30) as r: - Network accessline 36
try: with urllib.request.urlopen(req, timeout=30) as r: data = r.read() - Network accessline 37
with urllib.request.urlopen(req, timeout=30) as r:
skills/shared/brand-research/scripts/lib.py
- Executable scriptline 1
Executable file - Access to secretsline 3
[Credential-related source omitted] - Access to secretsline 21
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Access to secretsline 26
[Credential-related source omitted] - Access to secretsline 27
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted]
skills/shared/brand-research/scripts/register_asset.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/shared/brand-research/scripts/render_product_shot.py
skills/shared/brand-research/scripts/scaffold_brand.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/shared/brand-research/scripts/verify_pack.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/shared/company-contact-finder/SKILL.md
- Network accessline 154
| # | Name | Title | Company | LinkedIn URL | Location | |---|------|-------|---------|--------------|----------| | 1 | Jane Smith | Partner | EisnerAmper | https://linkedin.com/in/janesmith | New York, NY | - Network accessline 155
|---|------|-------|---------|--------------|----------| | 1 | Jane Smith | Partner | EisnerAmper | https://linkedin.com/in/janesmith | New York, NY | | 2 | John Doe | Controller | EisnerAmper | https://linkedin.com/in/johndoe | Chicago, IL - Network accessline 156
| 1 | Jane Smith | Partner | EisnerAmper | https://linkedin.com/in/janesmith | New York, NY | - Network accessline 157
| 2 | John Doe | Controller | EisnerAmper | https://linkedin.com/in/johndoe | Chicago, IL | - Network accessline 169
"title": "Partner", "company": "EisnerAmper", "linkedin_url": "https://linkedin.com/in/janesmith", - Network accessline 170
"company": "EisnerAmper", "linkedin_url": "https://linkedin.com/in/janesmith", "location": "New York, NY" - Network accessline 171
"linkedin_url": "https://linkedin.com/in/janesmith", - Network accessline 236
Find Partners at EisnerAmper (https://linkedin.com/company/eisneramper)
skills/shared/competitor-ad-intelligence/SKILL.md
- Network accessline 136
Pass the full public Google creative URL to the detail endpoint; a creative ID alone is not its input. See the [official detail contract](https://docs.scrapecreators.com/v1/google/ad/).
skills/shared/get-brand-assets/SKILL.md
- Network accessline 13
[Credential-related source omitted] - Access to secretsline 13
[Credential-related source omitted] - Network accessline 14
export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))") - Access to secretsline 19
[Credential-related source omitted] - Network accessline 41
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 42
[Credential-related source omitted] - Network accessline 50
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Network accessline 59
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Network accessline 68
[Credential-related source omitted] - Access to secretsline 68
[Credential-related source omitted] - Access to secretsline 69
[Credential-related source omitted] - Network accessline 77
[Credential-related source omitted] - Access to secretsline 77
[Credential-related source omitted] - Access to secretsline 78
[Credential-related source omitted] - Network accessline 121
[Credential-related source omitted] - Access to secretsline 121
[Credential-related source omitted] - Access to secretsline 122
[Credential-related source omitted] - Network accessline 129
[Credential-related source omitted] - Access to secretsline 129
[Credential-related source omitted] - Access to secretsline 130
[Credential-related source omitted] - Network accessline 137
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 138
[Credential-related source omitted]
skills/shared/goose-graphics-create-format/SKILL.md
skills/shared/goose-graphics-create-style/SKILL.md
skills/shared/goose-graphics/SKILL.md
- Network accessline 195
> Browse the style catalog at **https://skills.gooseworks.ai/styles** to see every published style with rendered examples.
skills/shared/goose-graphics/extract-style.md
skills/shared/goose-graphics/screenshot/fetch-full-tweet.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 36
try { const url = handle ? `https://x.com/${handle}/status/${tweetId}` - Network accessline 37
const url = handle ? `https://x.com/${handle}/status/${tweetId}` : `https://x.com/i/status/${tweetId}`; - Network accessline 38
? `https://x.com/${handle}/status/${tweetId}` - Network accessline 39
: `https://x.com/i/status/${tweetId}`;
skills/shared/goose-graphics/screenshot/fetch-tweet.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 13
* * Examples: * node fetch-tweet.js https://x.com/<handle>/status/<tweet-id> - Network accessline 14
* Examples: * node fetch-tweet.js https://x.com/<handle>/status/<tweet-id> * node fetch-tweet.js 2039963598244716919 - Network accessline 15
* node fetch-tweet.js https://x.com/<handle>/status/<tweet-id> - Network accessline 40
[Credential-related source omitted] - Network accessline 41
[Credential-related source omitted] - Network accessline 42
const response = await fetch(url); - Network accessline 117
try { const url = handle ? `https://x.com/${handle}/status/${tweetId}` - Network accessline 118
const url = handle ? `https://x.com/${handle}/status/${tweetId}` : `https://x.com/i/status/${tweetId}`; - Network accessline 119
? `https://x.com/${handle}/status/${tweetId}` - Network accessline 120
: `https://x.com/i/status/${tweetId}`;
skills/shared/goose-graphics/screenshot/package-lock.json
- Network accessline 14
"node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - Network accessline 15
"version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - Network accessline 16
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - Network accessline 28
"node_modules/playwright": { "version": "1.59.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", - Network accessline 29
"version": "1.59.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", - Network accessline 30
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", - Network accessline 46
"node_modules/playwright-core": { "version": "1.59.1", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", - Network accessline 47
"version": "1.59.1", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", - Network accessline 48
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz",
skills/shared/goose-graphics/screenshot/package.json
- Executable scriptline 1
Executable file
skills/shared/goose-graphics/screenshot/screenshot.js
- Executable scriptline 1
#!/usr/bin/env node
skills/shared/goose-graphics/sources/unsplash.md
- Access to secretsline 11
[Credential-related source omitted] - Network accessline 15
1. Go to https://unsplash.com/developers - Access to secretsline 25
[Credential-related source omitted] - Network accessline 53
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted]
skills/shared/hacker-news-scraper/SKILL.md
- Network accessline 11
Search Hacker News using the free [Algolia HN Search API](https://hn.algolia.com/api). No Apify token or API key needed. - Network accessline 55
"id": "12345678", "title": "Show HN: My new tool", "url": "https://example.com", - Network accessline 56
"title": "Show HN: My new tool", "url": "https://example.com", "author": "username", - Network accessline 57
"url": "https://example.com", - Network accessline 60
"num_comments": 15, "created_at": "2026-02-18T12:00:00.000Z", "hn_url": "https://news.ycombinator.com/item?id=12345678", - Network accessline 61
"created_at": "2026-02-18T12:00:00.000Z", "hn_url": "https://news.ycombinator.com/item?id=12345678", "text": "" - Network accessline 62
"hn_url": "https://news.ycombinator.com/item?id=12345678",
skills/shared/hacker-news-scraper/scripts/search_hn.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 20
HN_API_BASE = "https://hn.algolia.com/api/v1" - Network accessline 54
resp = requests.get(f"{HN_API_BASE}/search_by_date", params=params) - Network accessline 86
"num_comments": hit.get("num_comments") or 0, "created_at": hit.get("created_at", ""), "hn_url": f"https://news.ycombinator.com/item?id={hit.get('objectID', '')}", - Network accessline 87
"created_at": hit.get("created_at", ""), "hn_url": f"https://news.ycombinator.com/item?id={hit.get('objectID', '')}", "text": hit.get("story_text") or hit.get("comment_text") or "", - Network accessline 88
"hn_url": f"https://news.ycombinator.com/item?id={hit.get('objectID', '')}",
skills/shared/job-posting-intent/SKILL.md
- Network accessline 48
Track usage: https://console.apify.com/billing - Network accessline 55
# Get your token at https://console.apify.com/account/integrations - Access to secretsline 56
[Credential-related source omitted] - Network accessline 238
- [Apify LinkedIn Job Search Actor](https://apify.com/harvestapi/linkedin-job-search) - Network accessline 239
- [Apify API Token](https://console.apify.com/account/integrations) - Network accessline 240
- [Apify Billing Dashboard](https://console.apify.com/billing)
skills/shared/job-posting-intent/scripts/create_sheet.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 11
RUBE_URL = "https://rube.app" - Access to secretsline 12
[Credential-related source omitted] - Network accessline 24
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Network accessline 25
sys.exit(1) resp = requests.post( f"{RUBE_URL}/api/composio/execute", - Network accessline 26
resp = requests.post( - Network accessline 64
sheet_url = f"https://docs.google.com/spreadsheets/d/{spreadsheet_id}"
skills/shared/job-posting-intent/scripts/create_sheet_mcp.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 13
RUBE_MCP_URL = "https://rube.app/mcp" - Access to secretsline 14
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Network accessline 45
resp = requests.post(RUBE_MCP_URL, headers=hdrs, json=payload, timeout=120) - Network accessline 116
sheet_url = f"https://docs.google.com/spreadsheets/d/{{spreadsheet_id}}" - Network accessline 162
proxy_execute( "POST", f"https://sheets.googleapis.com/v4/spreadsheets/{{spreadsheet_id}}:batchUpdate", - Network accessline 163
"POST", f"https://sheets.googleapis.com/v4/spreadsheets/{{spreadsheet_id}}:batchUpdate", "googlesheets", - Network accessline 164
f"https://sheets.googleapis.com/v4/spreadsheets/{{spreadsheet_id}}:batchUpdate", "googlesheets", body={{"requests": requests_list}}
skills/shared/job-posting-intent/scripts/search_jobs.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 38
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Network accessline 42
BASE_URL = f"{GOOSEWORKS_API_BASE}/v1/proxy/apify" else: BASE_URL = "https://api.apify.com/v2" - Network accessline 44
BASE_URL = "https://api.apify.com/v2" - Network accessline 52
RUBE_MCP_URL = "https://rube.app/mcp" - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Network accessline 99
resp = requests.post( - Network accessline 112
for _ in range(120): # max 10 min time.sleep(5) status_resp = requests.get( - Network accessline 113
time.sleep(5) status_resp = requests.get( f"{BASE_URL}/actor-runs/{run_id}", - Network accessline 114
status_resp = requests.get( - Network accessline 134
items_resp = requests.get( - Access to secretsline 466
[Credential-related source omitted] - Network accessline 485
resp = requests.post(RUBE_MCP_URL, headers=hdrs, json=payload, timeout=120) - Network accessline 549
sheet_url = f"https://docs.google.com/spreadsheets/d/{{spreadsheet_id}}" - Network accessline 594
proxy_execute( "POST", f"https://sheets.googleapis.com/v4/spreadsheets/{{spreadsheet_id}}:batchUpdate", - Network accessline 595
"POST", f"https://sheets.googleapis.com/v4/spreadsheets/{{spreadsheet_id}}:batchUpdate", "googlesheets", - Network accessline 596
f"https://sheets.googleapis.com/v4/spreadsheets/{{spreadsheet_id}}:batchUpdate", "googlesheets", body={{"requests": requests_list}}
skills/shared/launch-meta-ad-campaign/references/direct-meta-adapter.md
- Access to secretsline 11
[Credential-related source omitted] - Network accessline 40
"targeting": { "geo_locations": { "countries": ["US"] } } }, "destination": { "url": "https://example.com/offer" }, - Network accessline 41
}, "destination": { "url": "https://example.com/offer" }, "destination_review": { - Network accessline 42
"destination": { "url": "https://example.com/offer" },
skills/shared/launch-meta-ad-campaign/tools/meta_marketing_api.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 18
const GRAPH_VERSION = process.env.META_GRAPH_API_VERSION || 'v25.0'; const GRAPH_BASE = `https://graph.facebook.com/${GRAPH_VERSION}`; - Network accessline 19
const GRAPH_BASE = `https://graph.facebook.com/${GRAPH_VERSION}`; - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 589
[Credential-related source omitted] - Access to secretsline 593
[Credential-related source omitted]
skills/shared/lead-qualification/SKILL.md
- Access to secretsline 222
[Credential-related source omitted] - Access to secretsline 364
[Credential-related source omitted] - Network accessline 365
- Run with `--dry-run` first to count the profiles, then get the user's yes before the paid run - **Web Search** — to research leads when enrichment data is sparse or missing - **Fetch (web page)** — to pull LinkedIn profiles, company pages - Network accessline 366
- **Web Search** — to research leads when enrichment data is sparse or missing - **Fetch (web page)** — to pull LinkedIn profiles, company pages, etc. - **Read/Write** — for CSV I/O and saving qualification prompts - Network accessline 367
- **Fetch (web page)** — to pull LinkedIn profiles, company pages, etc. - Network accessline 391
Using the seed-founders qualification prompt, qualify these people: - https://linkedin.com/in/person1 - Network accessline 392
- https://linkedin.com/in/person1 - Network accessline 393
- https://linkedin.com/in/person2 - Network accessline 394
- https://linkedin.com/in/person3
skills/shared/lead-qualification/scripts/enrich_leads.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Access to secretsline 26
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Network accessline 57
ACTOR_ID = "harvestapi~linkedin-profile-scraper" GOOSEWORKS_API_BASE = os.environ.get("GOOSEWORKS_API_BASE", "https://api.gooseworks.ai") - Network accessline 58
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Network accessline 62
BASE_URL = f"{GOOSEWORKS_API_BASE}/v1/proxy/apify" else: BASE_URL = "https://api.apify.com/v2" - Network accessline 63
else: BASE_URL = "https://api.apify.com/v2" ACTOR_URL = "https://console.apify.com/actors/harvestapi~linkedin-profile-scraper" - Network accessline 64
BASE_URL = "https://api.apify.com/v2" - Network accessline 65
ACTOR_URL = "https://console.apify.com/actors/harvestapi~linkedin-profile-scraper" - Network accessline 100
url = re.sub(r"^https?://(www\.)?", "https://", url) if not url.startswith("http"): url = f"https://linkedin.com/in/{url}" - Network accessline 101
if not url.startswith("http"): url = f"https://linkedin.com/in/{url}" return url - Network accessline 102
url = f"https://linkedin.com/in/{url}" - Network accessline 122
response = requests.post( - Network accessline 145
response = requests.get( - Network accessline 164
response = requests.get( - Access to secretsline 410
[Credential-related source omitted] - Access to secretsline 411
[Credential-related source omitted] - Access to secretsline 466
[Credential-related source omitted] - Access to secretsline 474
[Credential-related source omitted] - Access to secretsline 476
[Credential-related source omitted]
skills/shared/linkedin-profile-post-scraper/SKILL.md
- Network accessline 18
# Scrape recent posts from a profile python3 skills/linkedin-profile-post-scraper/scripts/scrape_linkedin_posts.py \ --profiles "https://www.linkedin.com/in/example-person" --max-posts 10 - Network accessline 19
python3 skills/linkedin-profile-post-scraper/scripts/scrape_linkedin_posts.py --profiles "https://www.linkedin.com/in/example-person" --max-posts 10 - Network accessline 20
--profiles "https://www.linkedin.com/in/example-person" --max-posts 10 - Network accessline 22
# Multiple profiles with keyword filtering python3 skills/linkedin-profile-post-scraper/scripts/scrape_linkedin_posts.py \ --profiles "https://www.linkedin.com/in/person1,https://www.linkedin.com/in/person2" \ - Network accessline 23
python3 skills/linkedin-profile-post-scraper/scripts/scrape_linkedin_posts.py --profiles "https://www.linkedin.com/in/person1,https://www.linkedin.com/in/person2" - Network accessline 24
--profiles "https://www.linkedin.com/in/person1,https://www.linkedin.com/in/person2" \ - Network accessline 27
# Summary table python3 skills/linkedin-profile-post-scraper/scripts/scrape_linkedin_posts.py \ --profiles "https://www.linkedin.com/in/example-person" --output summary - Network accessline 28
python3 skills/linkedin-profile-post-scraper/scripts/scrape_linkedin_posts.py --profiles "https://www.linkedin.com/in/example-person" --output summary - Network accessline 29
--profiles "https://www.linkedin.com/in/example-person" --output summary - Access to secretsline 41
[Credential-related source omitted] - Network accessline 50
- No native date filtering — dates are filtered client-side on `postedAt`/`postedDate` - Profile URLs must be full LinkedIn URLs (e.g. `https://www.linkedin.com/in/username`) - Network accessline 51
- Profile URLs must be full LinkedIn URLs (e.g. `https://www.linkedin.com/in/username`)
skills/shared/linkedin-profile-post-scraper/scripts/scrape_linkedin_posts.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 6
Usage: python3 scrape_linkedin_posts.py --profiles "https://www.linkedin.com/in/example-person" --max-posts 10 - Network accessline 7
python3 scrape_linkedin_posts.py --profiles "https://www.linkedin.com/in/example-person" --max-posts 10 - Network accessline 22
[Credential-related source omitted] - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Network accessline 26
BASE_URL = f"{GOOSEWORKS_API_BASE}/v1/proxy/apify" else: BASE_URL = "https://api.apify.com/v2" - Network accessline 28
BASE_URL = "https://api.apify.com/v2" - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Network accessline 63
resp = requests.post( - Network accessline 75
status_data = None while time_mod.time() < deadline: status_resp = requests.get( - Network accessline 76
while time_mod.time() < deadline: status_resp = requests.get( f"{BASE_URL}/acts/{ACTOR_ID}/runs/{run_id}", - Network accessline 77
status_resp = requests.get( - Network accessline 98
dataset_id = status_data["data"]["defaultDatasetId"] dataset_resp = requests.get( - Network accessline 99
dataset_resp = requests.get( - Network accessline 207
%(prog)s --profiles "https://www.linkedin.com/in/example-person" --max-posts 10 - Network accessline 213
%(prog)s --profiles "https://www.linkedin.com/in/example-person" --output summary
skills/shared/meta-ad-manager/contract/tests/test_validate.py
- Executable scriptline 1
Executable file
skills/shared/meta-ad-manager/contract/validate.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/shared/meta-ad-policy-checker/SKILL.md
- Network accessline 82
https://transparency.meta.com/policies/ad-standards/
skills/shared/reddit-post-finder/SKILL.md
- Network accessline 36
1. Builds full Reddit URLs for each subreddit (e.g. `https://www.reddit.com/r/growthhacking/top/?t=week`) - Access to secretsline 53
[Credential-related source omitted] - Network accessline 65
{ "startUrls": [{"url": "https://www.reddit.com/r/growthhacking/top/?t=week"}], - Network accessline 66
"startUrls": [{"url": "https://www.reddit.com/r/growthhacking/top/?t=week"}], - Network accessline 131
"numberOfComments": 15, "createdAt": "2026-02-18T12:00:00.000Z", "url": "https://reddit.com/r/..." - Network accessline 132
"createdAt": "2026-02-18T12:00:00.000Z", "url": "https://reddit.com/r/..." } - Network accessline 133
"url": "https://reddit.com/r/..."
skills/shared/reddit-post-finder/references/apify-config.md
- Access to secretsline 8
[Credential-related source omitted] - Network accessline 11
Get a token at: https://console.apify.com/account/integrations - Network accessline 18
{ "startUrls": [{"url": "https://www.reddit.com/r/growthhacking/top/?t=week"}], - Network accessline 19
"startUrls": [{"url": "https://www.reddit.com/r/growthhacking/top/?t=week"}], - Network accessline 34
| Goal | URL Pattern | |------|-------------| | Top posts this week | `https://www.reddit.com/r/{sub}/top/?t=week` | - Network accessline 35
|------|-------------| | Top posts this week | `https://www.reddit.com/r/{sub}/top/?t=week` | | Top posts this month | `https://www.reddit.com/r/{sub}/top/?t=month` | - Network accessline 36
| Top posts this week | `https://www.reddit.com/r/{sub}/top/?t=week` | - Network accessline 37
| Top posts this month | `https://www.reddit.com/r/{sub}/top/?t=month` | - Network accessline 38
| Hot posts (right now) | `https://www.reddit.com/r/{sub}/hot/` | - Network accessline 39
| Newest posts | `https://www.reddit.com/r/{sub}/new/` | - Network accessline 40
| Rising posts | `https://www.reddit.com/r/{sub}/rising/` | - Network accessline 56
"numComments": 15, "selfText": "Post content...", "url": "https://reddit.com/r/..." - Network accessline 57
"selfText": "Post content...", "url": "https://reddit.com/r/..." } - Network accessline 58
"url": "https://reddit.com/r/..." - Network accessline 65
[Credential-related source omitted] - Network accessline 66
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted] - Network accessline 69
"startUrls": [{"url": "https://www.reddit.com/r/growthhacking/top/?t=week"}], - Network accessline 76
[Credential-related source omitted] - Network accessline 77
[Credential-related source omitted] - Access to secretsline 77
[Credential-related source omitted] - Network accessline 79
[Credential-related source omitted] - Network accessline 80
[Credential-related source omitted] - Access to secretsline 80
[Credential-related source omitted] - Network accessline 86
[Credential-related source omitted] - Access to secretsline 86
[Credential-related source omitted] - Network accessline 89
"startUrls": [{"url": "https://www.reddit.com/r/growthhacking/top/?t=week"}], - Network accessline 100
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted]
skills/shared/reddit-post-finder/scripts/search_reddit.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 23
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Access to secretsline 26
[Credential-related source omitted] - Network accessline 27
BASE_URL = f"{GOOSEWORKS_API_BASE}/v1/proxy/apify" else: BASE_URL = "https://api.apify.com/v2" - Network accessline 29
BASE_URL = "https://api.apify.com/v2" - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 36
[Credential-related source omitted] - Network accessline 56
urls = [] for sub in subreddits: sub = sub.strip().strip("/").replace("r/", "").replace("https://www.reddit.com/r/", "") - Network accessline 57
for sub in subreddits: sub = sub.strip().strip("/").replace("r/", "").replace("https://www.reddit.com/r/", "") if sort == "top": - Network accessline 58
sub = sub.strip().strip("/").replace("r/", "").replace("https://www.reddit.com/r/", "") - Network accessline 59
if sort == "top": url = f"https://www.reddit.com/r/{sub}/top/?t={time}" elif sort in ("hot", "new", "rising"): - Network accessline 60
url = f"https://www.reddit.com/r/{sub}/top/?t={time}" - Network accessline 61
elif sort in ("hot", "new", "rising"): url = f"https://www.reddit.com/r/{sub}/{sort}/" else: - Network accessline 62
url = f"https://www.reddit.com/r/{sub}/{sort}/" - Network accessline 63
else: url = f"https://www.reddit.com/r/{sub}/top/?t={time}" urls.append({"url": url}) - Network accessline 64
url = f"https://www.reddit.com/r/{sub}/top/?t={time}" - Network accessline 88
print(f"Starting Apify actor run...", file=sys.stderr) resp = requests.post( - Network accessline 89
resp = requests.post( - Network accessline 100
deadline = time_mod.time() + timeout while time_mod.time() < deadline: status_resp = requests.get( - Network accessline 101
while time_mod.time() < deadline: status_resp = requests.get( f"{BASE_URL}/acts/{ACTOR_ID}/runs/{run_id}", - Network accessline 102
status_resp = requests.get( - Network accessline 123
dataset_id = status_data["data"]["defaultDatasetId"] dataset_resp = requests.get( - Network accessline 124
dataset_resp = requests.get(
skills/shared/remix-graphic-ad-from-reference/assets/overlay-template.html
- Network accessline 11
<head> <meta charset="UTF-8"> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 12
<meta charset="UTF-8"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 13
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 14
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 15
<!-- swap Lexend for the brand font --> <link href="https://fonts.googleapis.com/css2?family={{FONT}}:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet"> <style> - Network accessline 16
<link href="https://fonts.googleapis.com/css2?family={{FONT}}:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet">
skills/shared/remix-graphic-ad-from-reference/scripts/cutout_product.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/shared/scrapecreators-api/SKILL.md
- Network accessline 14
1. **GooseWorks MCP available:** inspect and call the live `data_call_provider` tool. Pass the operation fields directly. This is the preferred path in ChatGPT, Cowork, and any client without a terminal. It uses the first-party GooseWorks S - Network accessline 15
2. **Local GooseWorks CLI available:** translate the operation into `gooseworks call <provider> <path>`, adding the method, query, or body options represented in the operation. The CLI uses the same first-party proxy. 3. **User-owned Scrape - Network accessline 16
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Network accessline 31
Use ScrapeCreators' official OpenAPI as the endpoint source of truth: `https://docs.scrapecreators.com/openapi.json`. Do not use Orthogonal search or details to discover ScrapeCreators operations because its mirrored catalog can be incomple - Network accessline 61
Endpoint names can change. If a request fails or the exact parameters are unclear, read `https://docs.scrapecreators.com/openapi.json` before guessing.
skills/video/animate-image/SKILL.md
- Network accessline 12
This workflow requires the GooseWorks MCP connector (`https://mcp.gooseworks.ai/mcp`). It uses three tools: `ads_creative_animation_quote` (free price), `ads_creative_animate` (paid start) and `job_get` (poll). Some clients list tools by gr
skills/video/caption-burn/scripts/_fonts.py
- Executable scriptline 1
Executable file - Network accessline 20
FONT_URL = "https://github.com/google/fonts/raw/main/apache/roboto/static/Roboto-Bold.ttf" - Access to secretsline 28
[Credential-related source omitted] - Network accessline 34
if not FONT_CACHE.exists(): FONT_CACHE.parent.mkdir(parents=True, exist_ok=True) urllib.request.urlretrieve(FONT_URL, FONT_CACHE) - Network accessline 35
FONT_CACHE.parent.mkdir(parents=True, exist_ok=True) urllib.request.urlretrieve(FONT_URL, FONT_CACHE) return str(FONT_CACHE) - Network accessline 36
urllib.request.urlretrieve(FONT_URL, FONT_CACHE) - Network accessline 51
"/usr/share/fonts/truetype/liberation/LiberationSerif-Bold.ttf", ] SERIF_URL = "https://github.com/google/fonts/raw/main/ofl/merriweather/static/Merriweather-Bold.ttf" - Network accessline 52
] SERIF_URL = "https://github.com/google/fonts/raw/main/ofl/merriweather/static/Merriweather-Bold.ttf" SERIF_CACHE = pathlib.Path(os.path.expanduser("~/.cache/gooseworks/fonts/Merriweather-Bold.ttf")) - Network accessline 53
SERIF_URL = "https://github.com/google/fonts/raw/main/ofl/merriweather/static/Merriweather-Bold.ttf" - Network accessline 63
if not SERIF_CACHE.exists(): SERIF_CACHE.parent.mkdir(parents=True, exist_ok=True) urllib.request.urlretrieve(SERIF_URL, SERIF_CACHE) - Network accessline 64
SERIF_CACHE.parent.mkdir(parents=True, exist_ok=True) urllib.request.urlretrieve(SERIF_URL, SERIF_CACHE) return ImageFont.truetype(str(SERIF_CACHE), px) - Network accessline 65
urllib.request.urlretrieve(SERIF_URL, SERIF_CACHE)
skills/video/caption-burn/scripts/captions.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/caption-burn/scripts/footprint.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/caption-burn/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/caption-burn/scripts/plates.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/caption-burn/scripts/transcribe.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/compose-creator-layer/scripts/compose.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/compose-creator-layer/tests/test_compose_split.py
- Executable scriptline 1
Executable file
skills/video/create-apple-notes-mockup/generate.js
- Executable scriptline 1
Executable file
skills/video/create-apple-notes-mockup/package.json
- Executable scriptline 1
Executable file
skills/video/create-apple-notes-mockup/render.js
- Executable scriptline 1
#!/usr/bin/env node
skills/video/create-apple-notes-mockup/screenshot.js
- Executable scriptline 1
Executable file
skills/video/create-apple-notes-mockup/templates/icons.js
- Executable scriptline 1
Executable file
skills/video/create-apple-notes-mockup/templates/note.css
- Network accessline 266
position: absolute; inset: 0; background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'><path d='M - Network accessline 267
inset: 0; background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'><path d='M5 12 L10 17 L19 7'/></ - Network accessline 268
background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'><path d='M5 12 L10 17 L19 7'/></svg>") cente
skills/video/create-apple-notes-mockup/tests/run-all.sh
- Executable scriptline 1
#!/usr/bin/env bash
skills/video/create-chatgpt-mockup/examples/assets/sunscreen-sky.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800">
skills/video/create-chatgpt-mockup/generate.js
- Executable scriptline 1
#!/usr/bin/env node
skills/video/create-chatgpt-mockup/package.json
- Executable scriptline 1
Executable file
skills/video/create-chatgpt-mockup/render.js
- Executable scriptline 1
#!/usr/bin/env node
skills/video/create-chatgpt-mockup/screenshot.js
- Executable scriptline 1
#!/usr/bin/env node
skills/video/create-chatgpt-mockup/templates/icons.js
- Executable scriptline 1
Executable file
skills/video/create-chatgpt-mockup/tests/run-all.sh
skills/video/create-creator-takes-h3/scripts/align_beats.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/create-creator-takes-h3/scripts/content_review.py
- Executable scriptline 1
Executable file
skills/video/create-creator-takes-h3/scripts/join_takes.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/create-creator-takes-h3/scripts/make_character.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/create-creator-takes-h3/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/create-creator-takes-h3/scripts/pair_voice.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/create-creator-takes-h3/scripts/plan_takes.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/create-creator-takes-h3/scripts/run_takes.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/create-creator-takes-h3/scripts/tiers.py
- Executable scriptline 1
Executable file
skills/video/create-creator-takes-h3/tests/test_action_skin_light.py
- Executable scriptline 1
Executable file
skills/video/create-creator-takes-h3/tests/test_hands_voice_pace.py
- Executable scriptline 1
Executable file
skills/video/create-creator-takes-h3/tests/test_make_character.py
- Executable scriptline 1
Executable file
skills/video/create-creator-takes-h3/tests/test_quality_tier.py
- Executable scriptline 1
Executable file
skills/video/create-creator-takes-h3/tests/test_run_takes_rejection.py
- Executable scriptline 1
Executable file - Network accessline 58
self.httpd = http.server.ThreadingHTTPServer(("127.0.0.1", 0), _Handler) self.httpd.mock = self self.base = "http://127.0.0.1:%d" % self.httpd.server_port - Network accessline 59
self.httpd.mock = self self.base = "http://127.0.0.1:%d" % self.httpd.server_port threading.Thread(target=self.httpd.serve_forever, daemon=True).start() - Network accessline 60
self.base = "http://127.0.0.1:%d" % self.httpd.server_port - Network accessline 85
return h.send(422, self.reject_body, {"x-fal-request-id": "req-rejected-%d" % len(self.submits)}) q = "https://queue.fal.run/%s/requests/ok-%d" % (rest, len(self.submits)) - Network accessline 86
{"x-fal-request-id": "req-rejected-%d" % len(self.submits)}) q = "https://queue.fal.run/%s/requests/ok-%d" % (rest, len(self.submits)) return h.send(200, {"request_id": "ok", "status_url": q + "/status", "response_ur - Network accessline 87
q = "https://queue.fal.run/%s/requests/ok-%d" % (rest, len(self.submits)) - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted]
skills/video/create-creator-takes-h3/tests/test_voice_ethnicity.py
- Executable scriptline 1
Executable file
skills/video/create-image-fal/SKILL.md
- Network accessline 59
gen_image.py --model fal-ai/nano-banana/edit --image product.png --image https://.../scene.jpg \
skills/video/create-image-fal/references/avatar-generation.md
- Network accessline 77
Fal documents [Seedream v4](https://fal.ai/models/fal-ai/bytedance/seedream/v4/text-to-image/api) as `fal-ai/bytedance/seedream/v4/text-to-image` and [Seedream v5 Pro](https://fal.ai/models/bytedance/seedream/v5/pro/text-to-image/api) as `b
skills/video/create-image-fal/scripts/brand_pack_lint.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 18
python brand_pack_lint.py --use held --model openai/gpt-image-2/edit \ --image https://.../pack-front.jpg --prompt "..." exit 1 with the problems - Network accessline 19
--image https://.../pack-front.jpg --prompt "..." exit 1 with the problems
skills/video/create-image-fal/scripts/gen_image.py
skills/video/create-image-fal/scripts/image_quality.py
- Executable scriptline 1
Executable file
skills/video/create-image-fal/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/create-image-fal/tests/test_brand_pack_lint.py
- Executable scriptline 1
Executable file
skills/video/create-image-fal/tests/test_image_quality.py
- Executable scriptline 1
Executable file
skills/video/create-image-gpt-image-fal/SKILL.md
- Access to secretsline 35
[Credential-related source omitted] - Network accessline 56
python3 .../generate.py --prompt "..." --output /path/to/angle-3q-left.png --ref-image "https://.../anchor.png" - Network accessline 57
--prompt "..." \ --output /path/to/angle-3q-left.png \ --ref-image "https://.../anchor.png" \ - Network accessline 58
--output /path/to/angle-3q-left.png \ --ref-image "https://.../anchor.png" \ --aspect-ratio 9:16 - Network accessline 59
--ref-image "https://.../anchor.png" \ - Access to secretsline 96
[Credential-related source omitted] - Network accessline 123
- [fal.ai/models/fal-ai/gpt-image-1](https://fal.ai/models/fal-ai/gpt-image-1) - Network accessline 124
- [fal.ai/models/openai/gpt-image-2](https://fal.ai/models/openai/gpt-image-2)
skills/video/create-image-gpt-image-fal/scripts/generate.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/create-image-gpt-image-fal/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/create-image-gpt-image-fal/tests/smoke-test.md
skills/video/create-imessage-mockup/generate.js
skills/video/create-imessage-mockup/package-lock.json
- Network accessline 17
"node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - Network accessline 18
"version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - Network accessline 19
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - Network accessline 31
"node_modules/playwright": { "version": "1.59.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", - Network accessline 32
"version": "1.59.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", - Network accessline 33
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", - Network accessline 49
"node_modules/playwright-core": { "version": "1.59.1", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", - Network accessline 50
"version": "1.59.1", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", - Network accessline 51
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz",
skills/video/create-imessage-mockup/package.json
- Executable scriptline 1
Executable file
skills/video/create-imessage-mockup/render.js
- Executable scriptline 1
#!/usr/bin/env node
skills/video/create-imessage-mockup/screenshot.js
- Executable scriptline 1
#!/usr/bin/env node
skills/video/create-imessage-mockup/templates/icons.js
- Executable scriptline 1
Executable file
skills/video/create-imessage-mockup/tests/run-all.sh
skills/video/create-kinetic-typography/scripts/render.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/create-music-elevenlabs/scripts/gen_music.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/create-music-elevenlabs/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/create-video-fal/scripts/gen_video.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 5
gen_video.py --model fal-ai/kling-video/v3/pro/image-to-video \ --payload '{"prompt":"...","image_url":"https://...","duration":"5","cfg_scale":0.5}' \ - Network accessline 6
--payload '{"prompt":"...","image_url":"https://...","duration":"5","cfg_scale":0.5}' \
skills/video/create-video-fal/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/create-video-seedance-2-fal/SKILL.md
- Network accessline 255
- FAL model page: https://fal.ai/models/bytedance/seedance-2.0/reference-to-video
skills/video/create-video-seedance-2-fal/scripts/generate.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/create-video-seedance-2-fal/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/create-video-seedance-2-fal/tests/expected-output.md
- Network accessline 16
- `generate_audio: <bool>` - `seed: <int>` (FAL-returned; reuse for deterministic re-runs) - `video_url: "<https://...>"` - Network accessline 17
- `seed: <int>` (FAL-returned; reuse for deterministic re-runs) - `video_url: "<https://...>"` - `cost_estimate_usd: <float>` - Network accessline 18
- `video_url: "<https://...>"`
skills/video/create-video-seedance-2-fal/tests/smoke-test.md
- Access to secretsline 8
[Credential-related source omitted]
skills/video/create-video-seedance-2-fal/tests/test_seedance_policy_rejection.py
- Executable scriptline 1
Executable file - Network accessline 62
self.httpd = http.server.ThreadingHTTPServer(("127.0.0.1", 0), _Handler) self.httpd.mock = self self.base = "http://127.0.0.1:%d" % self.httpd.server_port - Network accessline 63
self.httpd.mock = self self.base = "http://127.0.0.1:%d" % self.httpd.server_port threading.Thread(target=self.httpd.serve_forever, daemon=True).start() - Network accessline 64
self.base = "http://127.0.0.1:%d" % self.httpd.server_port - Network accessline 84
{"content-type": "application/json", "x-fal-request-id": "req-rejected-%d" % len(self.submits)}) q = "https://queue.fal.run/%s/requests/ok-%d" % (rest, len(self.submits)) - Network accessline 85
"x-fal-request-id": "req-rejected-%d" % len(self.submits)}) q = "https://queue.fal.run/%s/requests/ok-%d" % (rest, len(self.submits)) return h.send(200, {"request_id": "ok", "status_url": q + "/status", "response_url - Network accessline 86
q = "https://queue.fal.run/%s/requests/ok-%d" % (rest, len(self.submits)) - Access to secretsline 108
[Credential-related source omitted] - Network accessline 110
def run_generate(self, prompt="UGC review. " + MARK, image="https://cdn.example/creator.png", - Access to secretsline 113
[Credential-related source omitted] - Network accessline 156
def test_changed_inputs_submit_again(self): self.assertEqual(self.run_generate()[0].returncode, 3) r, _ = self.run_generate(image="https://cdn.example/other-creator.png") # new image - Network accessline 157
self.assertEqual(self.run_generate()[0].returncode, 3) r, _ = self.run_generate(image="https://cdn.example/other-creator.png") # new image self.assertEqual(r.returncode, 3, r.stderr) - Network accessline 158
r, _ = self.run_generate(image="https://cdn.example/other-creator.png") # new image
skills/video/create-vo-elevenlabs/scripts/gen_vo.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 133
else: api, token, agent = proxy._cfg() response = proxy.requests.post(api + "/api/internal/elevenlabs-proxy" + endpoint, - Network accessline 134
api, token, agent = proxy._cfg() response = proxy.requests.post(api + "/api/internal/elevenlabs-proxy" + endpoint, params=proxy._params(token, agent), json=body, timeout=300) - Network accessline 135
response = proxy.requests.post(api + "/api/internal/elevenlabs-proxy" + endpoint, - Possible obfuscationline 147
audio = base64.b64decode(result["audio_base64"], validate=True)
skills/video/create-vo-elevenlabs/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/create-vo-elevenlabs/scripts/read_pronunciations.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/create-vo-elevenlabs/tests/test_gen_vo.py
- Executable scriptline 1
Executable file
skills/video/create-vo-elevenlabs/tests/test_pace.py
- Executable scriptline 1
Executable file - Network accessline 28
self.proxy = mock.Mock() self.proxy.relay_mode.return_value = False self.proxy._cfg.return_value = ("https://example.test", "test-token", "test-agent") - Network accessline 29
self.proxy.relay_mode.return_value = False self.proxy._cfg.return_value = ("https://example.test", "test-token", "test-agent") self.proxy._params.return_value = {} - Network accessline 30
self.proxy._cfg.return_value = ("https://example.test", "test-token", "test-agent")
skills/video/create-vo-elevenlabs/tests/test_timestamps.py
- Executable scriptline 1
Executable file - Network accessline 22
self.proxy = mock.Mock() self.proxy.relay_mode.return_value = False self.proxy._cfg.return_value = ("https://example.test", "test-token", "test-agent") - Network accessline 23
self.proxy.relay_mode.return_value = False self.proxy._cfg.return_value = ("https://example.test", "test-token", "test-agent") self.proxy._params.return_value = {"agent": "test-agent"} - Network accessline 24
self.proxy._cfg.return_value = ("https://example.test", "test-token", "test-agent") self.proxy._params.return_value = {"agent": "test-agent"} self.proxy.requests.post.return_value.json.return_value = { - Network accessline 31
timestamped_tts("hi", "voice-a", self.out, "eleven_multilingual_v2", settings, self.proxy) args, kwargs = self.proxy.requests.post.call_args self.assertEqual(args[0], "https://example.test/api/internal/elevenlabs-proxy/v1/te - Network accessline 32
args, kwargs = self.proxy.requests.post.call_args self.assertEqual(args[0], "https://example.test/api/internal/elevenlabs-proxy/v1/text-to-speech/voice-a/with-timestamps") self.assertEqual(kwargs["json"], {"text": "hi", "mod - Network accessline 33
self.assertEqual(args[0], "https://example.test/api/internal/elevenlabs-proxy/v1/text-to-speech/voice-a/with-timestamps") - Network accessline 38
def test_relay_uses_returned_download_and_alignment(self): self.proxy.relay_mode.return_value = True self.proxy._relay.return_value = {"download_url": "https://example.test/audio", "alignment": self.alignment} - Network accessline 40
self.proxy._relay.return_value = {"download_url": "https://example.test/audio", "alignment": self.alignment} - Network accessline 42
self.proxy.download.side_effect = lambda url, path: Path(path).write_bytes(b"relay-audio") timestamped_tts("hi", "voice-a", self.out, "eleven_multilingual_v2", proxy=self.proxy) self.proxy.download.assert_called_once_with("h - Network accessline 43
timestamped_tts("hi", "voice-a", self.out, "eleven_multilingual_v2", proxy=self.proxy) self.proxy.download.assert_called_once_with("https://example.test/audio", str(self.out)) self.proxy.requests.post.assert_not_called() - Network accessline 44
self.proxy.download.assert_called_once_with("https://example.test/audio", str(self.out))
skills/video/footage-cutlist/scripts/_common.py
- Executable scriptline 1
Executable file - Network accessline 22
FONT_URL = "https://github.com/google/fonts/raw/main/apache/roboto/static/Roboto-Bold.ttf" - Access to secretsline 30
[Credential-related source omitted] - Network accessline 36
if not FONT_CACHE.exists(): FONT_CACHE.parent.mkdir(parents=True, exist_ok=True) urllib.request.urlretrieve(FONT_URL, FONT_CACHE) - Network accessline 37
FONT_CACHE.parent.mkdir(parents=True, exist_ok=True) urllib.request.urlretrieve(FONT_URL, FONT_CACHE) return str(FONT_CACHE) - Network accessline 38
urllib.request.urlretrieve(FONT_URL, FONT_CACHE)
skills/video/footage-cutlist/scripts/cut.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/footage-cutlist/scripts/cutlist.py
- Executable scriptline 1
Executable file
skills/video/footage-cutlist/scripts/filmed.py
- Executable scriptline 1
Executable file
skills/video/footage-cutlist/scripts/photo.py
- Executable scriptline 1
Executable file
skills/video/footage-cutlist/scripts/preview.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/footage-cutlist/scripts/survey.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/media-proxy/SKILL.md
- Access to secretsline 3
[Credential-related source omitted] - Access to secretsline 163
[Credential-related source omitted] - Network accessline 217
`media` row and an `upload` block. 2. PUT the file to `upload.url` with `upload.method` and `upload.required_headers` (`curl -X PUT -T <file> "<upload.url>"`). - Network accessline 218
2. PUT the file to `upload.url` with `upload.method` and `upload.required_headers` (`curl -X PUT -T <file> "<upload.url>"`). 3. Finish the upload: after the PUT, call `media_confirm` with `brand_id` and `media_id` - Network accessline 219
(`curl -X PUT -T <file> "<upload.url>"`).
skills/video/media-proxy/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/media-proxy/scripts/resume.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/media-proxy/tests/test_call_query.py
- Executable scriptline 1
Executable file - Network accessline 37
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted] - Network accessline 38
mock.patch.object(mp, "_cfg", return_value=("https://api.example", "tok", "agent-1")), \ mock.patch.dict(os.environ, {"GW_PROJECT_ID": "proj-1"}), \ mock.patch.object(mp.requests, "post", side_effect=post): - Access to secretsline 39
[Credential-related source omitted]
skills/video/media-proxy/tests/test_media_proxy_policy.py
- Executable scriptline 1
Executable file - Network accessline 75
self.submits = [] self.status_body = {"status": "COMPLETED"} self.result = (200, {"video": {"url": "https://v3.fal.media/files/out.mp4"}, "seed": 7}) - Network accessline 76
self.status_body = {"status": "COMPLETED"} self.result = (200, {"video": {"url": "https://v3.fal.media/files/out.mp4"}, "seed": 7}) self.httpd = http.server.ThreadingHTTPServer(("127.0.0.1", 0), _Handler) - Network accessline 77
self.result = (200, {"video": {"url": "https://v3.fal.media/files/out.mp4"}, "seed": 7}) - Network accessline 78
self.httpd = http.server.ThreadingHTTPServer(("127.0.0.1", 0), _Handler) self.httpd.mock = self self.base = "http://127.0.0.1:%d" % self.httpd.server_port - Network accessline 79
self.httpd.mock = self self.base = "http://127.0.0.1:%d" % self.httpd.server_port threading.Thread(target=self.httpd.serve_forever, daemon=True).start() - Network accessline 80
self.base = "http://127.0.0.1:%d" % self.httpd.server_port - Network accessline 99
{"x-fal-request-id": "req-rejected-%d" % len(self.submits)}) rid = "req-ok-%d" % len(self.submits) q = "https://queue.fal.run/%s/requests/%s" % (rest, rid) - Network accessline 100
rid = "req-ok-%d" % len(self.submits) q = "https://queue.fal.run/%s/requests/%s" % (rest, rid) return h.send(200, {"request_id": rid, "status_url": q + "/status", "response_url": q}) - Network accessline 101
q = "https://queue.fal.run/%s/requests/%s" % (rest, rid) - Network accessline 207
def test_result_payload_is_not_an_error(self): self.mp._raise_if_fal_error({"video": {"url": "https://x/y.mp4"}, "seed": 1}, MODEL) - Network accessline 208
self.mp._raise_if_fal_error({"video": {"url": "https://x/y.mp4"}, "seed": 1}, MODEL) - Access to secretsline 222
[Credential-related source omitted] - Access to secretsline 228
[Credential-related source omitted] - Access to secretsline 235
[Credential-related source omitted] - Network accessline 243
def payload(self, prompt="likeness", url="https://cdn/a.png"): - Network accessline 275
self.assertIn("forget " + cm.exception.ledger_key, str(cm.exception)) with self.assertRaises(self.mp.FalPolicyRejection) as cm: # same digest, new URL self.mp._fal_run(MODEL, self.payload(url="https://cdn/new.png"), pol - Network accessline 276
with self.assertRaises(self.mp.FalPolicyRejection) as cm: # same digest, new URL self.mp._fal_run(MODEL, self.payload(url="https://cdn/new.png"), poll_s=0, input_digest="content-A") - Network accessline 277
self.mp._fal_run(MODEL, self.payload(url="https://cdn/new.png"), poll_s=0, - Access to secretsline 301
[Credential-related source omitted] - Access to secretsline 328
[Credential-related source omitted] - Access to secretsline 355
[Credential-related source omitted] - Network accessline 386
self.mp._fal_run(MODEL, self.payload(), poll_s=0) url = self.mp._fal_run(MODEL, self.payload(prompt="original character"), poll_s=0) self.assertEqual(url["video"]["url"], "https://v3.fal.media/files/out.mp4") - Network accessline 387
url = self.mp._fal_run(MODEL, self.payload(prompt="original character"), poll_s=0) self.assertEqual(url["video"]["url"], "https://v3.fal.media/files/out.mp4") with self.assertRaises(self.mp.FalPolicyRejection): # new image: - Network accessline 388
self.assertEqual(url["video"]["url"], "https://v3.fal.media/files/out.mp4") - Network accessline 389
with self.assertRaises(self.mp.FalPolicyRejection): # new image: sent, refused again self.mp._fal_run(MODEL, self.payload(url="https://cdn/b.png"), poll_s=0) with self.assertRaises(self.mp.FalPolicyRejection): # other - Network accessline 390
self.mp._fal_run(MODEL, self.payload(url="https://cdn/b.png"), poll_s=0) - Network accessline 396
self.decision["likeness"] = (422, SHAPES["gooseworks_wrapped"][0]) with self.assertRaises(self.mp.FalPolicyRejection): self.mp._fal_run(MODEL, self.payload(url="https://cdn/up-1.png"), poll_s=0, - Network accessline 397
with self.assertRaises(self.mp.FalPolicyRejection): self.mp._fal_run(MODEL, self.payload(url="https://cdn/up-1.png"), poll_s=0, input_digest="content-A") - Network accessline 398
self.mp._fal_run(MODEL, self.payload(url="https://cdn/up-1.png"), poll_s=0, - Network accessline 399
input_digest="content-A") with self.assertRaises(self.mp.FalPolicyRejection) as cm: # same content, new URL self.mp._fal_run(MODEL, self.payload(url="https://cdn/up-2.png"), poll_s=0, - Network accessline 400
with self.assertRaises(self.mp.FalPolicyRejection) as cm: # same content, new URL self.mp._fal_run(MODEL, self.payload(url="https://cdn/up-2.png"), poll_s=0, input_digest="content-A") - Network accessline 401
self.mp._fal_run(MODEL, self.payload(url="https://cdn/up-2.png"), poll_s=0, - Network accessline 405
self.assertEqual(self.proxy.submits[0]["headers"].get("x-gw-input-digest"), "content-A") with self.assertRaises(self.mp.FalPolicyRejection) as cm: # changed content: sent self.mp._fal_run(MODEL, self.payload(url="https: - Network accessline 406
with self.assertRaises(self.mp.FalPolicyRejection) as cm: # changed content: sent self.mp._fal_run(MODEL, self.payload(url="https://cdn/up-3.png"), poll_s=0, input_digest="content-B") - Network accessline 407
self.mp._fal_run(MODEL, self.payload(url="https://cdn/up-3.png"), poll_s=0,
skills/video/mix-master/scripts/mix.sh
skills/video/render-3d-character-explainer/scripts/compose.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-3d-character-explainer/scripts/make_captions.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-3d-product-showcase/scripts/build_endcard.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 80
doc = f"""<!doctype html><html><head><meta charset="utf-8"> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 81
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family={urllib.parse.quote_plus(a.headline_font)}:wght@600;700&di - Network accessline 82
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family={urllib.parse.quote_plus(a.headline_font)}:wght@600;700&display=swap" rel="stylesheet"> <style> - Network accessline 83
<link href="https://fonts.googleapis.com/css2?family={urllib.parse.quote_plus(a.headline_font)}:wght@600;700&display=swap" rel="stylesheet">
skills/video/render-3d-product-showcase/scripts/build_masters.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-3d-product-showcase/scripts/config.example.json
- Network accessline 14
"form_factor": "four-part fountain pen: screw cap with brass band, steel nib section, piston ink converter, teal resin barrel", "hero_png": "assets/product-photos/meridian-14/hero.png", "pdp_url": "https://quillmere.example/products - Network accessline 15
"hero_png": "assets/product-photos/meridian-14/hero.png", "pdp_url": "https://quillmere.example/products/meridian-14" }, - Network accessline 16
"pdp_url": "https://quillmere.example/products/meridian-14"
skills/video/render-3d-product-showcase/scripts/shoot.js
- Executable scriptline 1
#!/usr/bin/env node
skills/video/render-absurdist-explainer/scripts/build_endcard.py
skills/video/render-absurdist-explainer/scripts/compose.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-absurdist-explainer/scripts/make_captions.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-airdrop-carousel/scripts/build_card.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-airdrop-carousel/scripts/compose_carousel.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-airdrop-carousel/scripts/one_shot.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-brand-identity-reveal/scripts/build_video.sh
- Executable scriptline 1
#!/usr/bin/env bash
skills/video/render-brand-identity-reveal/scripts/composite.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-brand-identity-reveal/scripts/measure_frame.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-brand-identity-reveal/scripts/recrop.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-brand-identity-reveal/scripts/render_art.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-brand-identity-reveal/scripts/scene.html
- Network accessline 4
<meta charset="UTF-8"> <title>palmglow — brand identity reveal</title> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 5
<title>palmglow — brand identity reveal</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800&family=Inter:wght@400;500;600;700;800&display= - Network accessline 6
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 7
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
skills/video/render-cgi-sizzle/scripts/PIPELINE.md
- Network accessline 20
| config field | source step | what it does | |---|---|---| | `voiceover.*` (voice_id, model_id, voice_settings, beats[].vo) | `render_eryn_vo.sh` (demo name; any chosen voice id) | One curl per beat → MP3 → `ffprobe` duration. The measured - Network accessline 21
|---|---|---| | `voiceover.*` (voice_id, model_id, voice_settings, beats[].vo) | `render_eryn_vo.sh` (demo name; any chosen voice id) | One curl per beat → MP3 → `ffprobe` duration. The measured durations become `beats[].vo_actual_duration_ - Network accessline 22
| `voiceover.*` (voice_id, model_id, voice_settings, beats[].vo) | `render_eryn_vo.sh` (demo name; any chosen voice id) | One curl per beat → MP3 → `ffprobe` duration. The measured durations become `beats[].vo_actual_duration_sec` and drive
skills/video/render-chatgpt-chat/scripts/mockup/generate.js
- Executable scriptline 1
#!/usr/bin/env node
skills/video/render-chatgpt-chat/scripts/mockup/templates/icons.js
- Executable scriptline 1
Executable file
skills/video/render-chatgpt-chat/scripts/package.json
- Executable scriptline 1
Executable file
skills/video/render-chatgpt-chat/scripts/record-chat.js
- Executable scriptline 1
#!/usr/bin/env node
skills/video/render-chatgpt-chat/scripts/render-end-card.js
- Executable scriptline 1
#!/usr/bin/env node
skills/video/render-chatgpt-chat/scripts/stitch.sh
skills/video/render-cosmic-mythology-voiceover/scripts/render.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-flat-vector-explainer/scripts/README.md
- Access to secretsline 100
[Credential-related source omitted]
skills/video/render-hand-swipe-flavor-listicle/SKILL.md
- Network accessline 39
| Product cutouts | The brand's transparent PNGs (PDP/press kit). | A brand-site photo is usually NOT a cutout. Remove its background with `create-image-fal`, model `fal-ai/birefnet/v2` (see below). | | Title TTF | Download a TTF matching ` - Network accessline 40
| Title TTF | Download a TTF matching `choices.title_style` (table below). | — | | Hand clip | The bundled clip (one woman's hand): `curl -fL -o hand-swipe-greenscreen.mp4 https://d2m0qbg34x1ii2.cloudfront.net/ads/samples/455dc125-e41c-46dc - Network accessline 41
| Hand clip | The bundled clip (one woman's hand): `curl -fL -o hand-swipe-greenscreen.mp4 https://d2m0qbg34x1ii2.cloudfront.net/ads/samples/455dc125-e41c-46dc-9fa6-9ae125e9b6bf/media-hand-swipe-greenscreen.mp4` (also in the recipe's `confi - Network accessline 56
| `choices.title_style` | Download | |---|---| | cursive / script | `curl -fL -o fonts/title.ttf https://github.com/google/fonts/raw/main/ofl/pacifico/Pacifico-Regular.ttf` | - Network accessline 57
|---|---| | cursive / script | `curl -fL -o fonts/title.ttf https://github.com/google/fonts/raw/main/ofl/pacifico/Pacifico-Regular.ttf` | | bold condensed sans | `curl -fL -o fonts/title.ttf https://github.com/google/fonts/raw/main/ofl/anto - Network accessline 58
| cursive / script | `curl -fL -o fonts/title.ttf https://github.com/google/fonts/raw/main/ofl/pacifico/Pacifico-Regular.ttf` | - Network accessline 59
| bold condensed sans | `curl -fL -o fonts/title.ttf https://github.com/google/fonts/raw/main/ofl/anton/Anton-Regular.ttf` | - Network accessline 60
| elegant serif | `curl -fL -o fonts/title.ttf https://github.com/google/fonts/raw/main/ofl/dmserifdisplay/DMSerifDisplay-Regular.ttf` | - Network accessline 61
| hand-drawn marker | `curl -fL -o fonts/title.ttf https://github.com/google/fonts/raw/main/apache/permanentmarker/PermanentMarker-Regular.ttf` | - Network accessline 113
cat > hand-payload.json <<'JSON' { "prompt": "Close-up of {hand}, the BACK of the hand facing the camera, index finger extended pointing up. The hand swipes smoothly from RIGHT to LEFT across the frame like scrolling to the next photo on - Network accessline 114
{ "prompt": "Close-up of {hand}, the BACK of the hand facing the camera, index finger extended pointing up. The hand swipes smoothly from RIGHT to LEFT across the frame like scrolling to the next photo on a phone. One clean horizontal swi - Network accessline 115
"prompt": "Close-up of {hand}, the BACK of the hand facing the camera, index finger extended pointing up. The hand swipes smoothly from RIGHT to LEFT across the frame like scrolling to the next photo on a phone. One clean horizontal swipe, - Network accessline 152
see-through; lower it if green fringe remains. - **Back of hand toward camera, finger UP.** A nails-forward hand reads as the wrong hand. - **Trim to the finger-UP window.** These clips curl the finger periodically. - Network accessline 153
- **Back of hand toward camera, finger UP.** A nails-forward hand reads as the wrong hand. - **Trim to the finger-UP window.** These clips curl the finger periodically. - **Scale the hand down and anchor it at the bottom** so the fingertip - Network accessline 154
- **Trim to the finger-UP window.** These clips curl the finger periodically.
skills/video/render-hand-swipe-flavor-listicle/scripts/build_hand_swipe_listicle.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-hand-swipe-flavor-listicle/tests/make_smoke_inputs.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-hand-swipe-flavor-listicle/tests/smoke-test.md
- Dangerous shell operationline 83
rm -rf /tmp/hs-smoke
skills/video/render-hook-replacement/scripts/make_demo.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-hook-replacement/scripts/replace_hook.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 58
with path.open("rb") as stream: prefix = stream.read(80) if prefix.startswith(b"version https://git-lfs.github.com/spec/"): - Network accessline 59
prefix = stream.read(80) if prefix.startswith(b"version https://git-lfs.github.com/spec/"): raise ValueError(f"media is a Git LFS pointer; fetch the actual file: {path}") - Network accessline 60
if prefix.startswith(b"version https://git-lfs.github.com/spec/"): raise ValueError(f"media is a Git LFS pointer; fetch the actual file: {path}") data = json.loads(run(["ffprobe", "-v", "error", "-show_streams", "-show_format",
skills/video/render-hook-replacement/scripts/replace_pack.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-hook-replacement/tests/test_replace_hook.py
skills/video/render-hypermotion/scripts/PIPELINE.md
- Network accessline 24
1. **Hero product PNG.** Scrape the highest-res PDP shot (Shopify: `curl -sL - Possible obfuscationline 32
open('logo.png', 'wb').write(base64.b64decode(m.group(1))) - Network accessline 38
4. **Font.** Download the **static** Space Grotesk Bold (variable TTF renders as Regular in PIL): `curl -sSL -o assets/fonts/SpaceGrotesk-Bold.ttf https://raw.githubusercontent.com/floriankarsten/space-grotesk/master/fonts/ttf/static/ - Network accessline 39
PIL): `curl -sSL -o assets/fonts/SpaceGrotesk-Bold.ttf https://raw.githubusercontent.com/floriankarsten/space-grotesk/master/fonts/ttf/static/SpaceGrotesk-Bold.ttf` 5. Write `config.json` + `brief.md`. **GATE 1** — show the brief + 5-blo - Network accessline 40
`curl -sSL -o assets/fonts/SpaceGrotesk-Bold.ttf https://raw.githubusercontent.com/floriankarsten/space-grotesk/master/fonts/ttf/static/SpaceGrotesk-Bold.ttf`
skills/video/render-ig-live-gallery/scripts/build.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-ig-live-gallery/tests/smoke-test.md
- Dangerous shell operationline 43
rm -rf /tmp/iglive-stills /tmp/iglive.mp4
skills/video/render-imessage-chat/scripts/chat-driver.js
- Executable scriptline 1
Executable file
skills/video/render-imessage-chat/scripts/check-render.py
- Executable scriptline 1
Executable file
skills/video/render-imessage-chat/scripts/mockup/generate.js
skills/video/render-imessage-chat/scripts/mockup/templates/icons.js
- Executable scriptline 1
Executable file
skills/video/render-imessage-chat/scripts/package-lock.json
- Network accessline 14
"node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - Network accessline 15
"version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - Network accessline 16
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - Network accessline 28
"node_modules/playwright": { "version": "1.61.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", - Network accessline 29
"version": "1.61.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", - Network accessline 30
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", - Network accessline 46
"node_modules/playwright-core": { "version": "1.61.1", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", - Network accessline 47
"version": "1.61.1", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", - Network accessline 48
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz",
skills/video/render-imessage-chat/scripts/package.json
- Executable scriptline 1
Executable file
skills/video/render-imessage-chat/scripts/record-chat.js
- Executable scriptline 1
#!/usr/bin/env node - Possible obfuscationline 29
const emojiOnly = s => /^(\p{Extended_Pictographic}|\p{Emoji_Presentation}|<U+FE0F>|<U+200D>|\s)+$/u.test(s || ''); - Network accessline 151
function dataURI(file) { const data = fs.readFileSync(file); if (data.subarray(0,80).toString().includes('version https://git-lfs')) throw Error(`Fetch the real LFS asset: ${file}`); - Network accessline 152
const data = fs.readFileSync(file); if (data.subarray(0,80).toString().includes('version https://git-lfs')) throw Error(`Fetch the real LFS asset: ${file}`); const ext = path.extname(file).slice(1).toLowerCase(); - Network accessline 153
if (data.subarray(0,80).toString().includes('version https://git-lfs')) throw Error(`Fetch the real LFS asset: ${file}`); - Network accessline 293
const EMOJI_CDN = 'https://cdn.jsdelivr.net/npm/emoji-datasource-apple@15.1.2/img/apple/64/'; - Network accessline 305
const file = path.join(cacheDir, n + '.png'); if (!fs.existsSync(file)) { const r = await fetch(EMOJI_CDN + n + '.png'); - Network accessline 306
if (!fs.existsSync(file)) { const r = await fetch(EMOJI_CDN + n + '.png'); if (!r.ok) continue; - Network accessline 307
const r = await fetch(EMOJI_CDN + n + '.png');
skills/video/render-imessage-chat/scripts/render-end-card.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 111
const face = (k, fb) => F[k] ? `font-family:'${F[k].family}',${fb};font-weight:${F[k].weight || 400};font-style:${F[k].style || 'normal'};` : `font-family:${fb};`; const gf = Object.values(F).filter(f => f.google).map(f => 'family=' + f.g - Network accessline 112
const gf = Object.values(F).filter(f => f.google).map(f => 'family=' + f.google).join('&'); const fontCssUrl = gf ? `https://fonts.googleapis.com/css2?${gf}&display=block` : ''; let fontLink = ''; // filled below with inlined @font-fac - Network accessline 113
const fontCssUrl = gf ? `https://fonts.googleapis.com/css2?${gf}&display=block` : ''; - Network accessline 146
if (ec.image_path) { const f=path.resolve(cfgDir,ec.image_path),buf=fs.readFileSync(f); if (buf.subarray(0,80).toString().includes('version https://git-lfs')) throw Error('Fetch the real end-card asset'); - Network accessline 147
const f=path.resolve(cfgDir,ec.image_path),buf=fs.readFileSync(f); if (buf.subarray(0,80).toString().includes('version https://git-lfs')) throw Error('Fetch the real end-card asset'); const ext=path.extname(f).slice(1).toLowerCase() - Network accessline 148
if (buf.subarray(0,80).toString().includes('version https://git-lfs')) throw Error('Fetch the real end-card asset'); - Network accessline 172
for (let i = 0; i < 4; i++) { try { const r = await fetch(u, { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124 Safari/537.36' } }); - Network accessline 173
try { const r = await fetch(u, { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124 Safari/537.36' } }); if (r.ok) return asText ? await r.text() : Buffe - Network accessline 174
const r = await fetch(u, { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124 Safari/537.36' } });
skills/video/render-imessage-chat/scripts/render.sh
- Executable scriptline 1
#!/usr/bin/env bash
skills/video/render-imessage-chat/scripts/stitch.sh
- Executable scriptline 1
#!/usr/bin/env bash - Dangerous shell operationline 48
trap 'rm -rf "$WORK"' EXIT - Network accessline 58
is_real_mp3() { [ -s "$1" ] && ! grep -q 'version https://git-lfs' "$1"; } - Possible obfuscationline 74
items = [(name, base64.b64decode(f["base64"]), f["sha256"]) for name, f in files.items()]
skills/video/render-imessage-chat/tests/test_chat.js
- Executable scriptline 1
Executable file - Network accessline 50
const backgrounds=['#8f2244','#22788f'].map((fill,i)=>{ const file=path.join(dir,`background-${i}.svg`); fs.writeFileSync(file,`<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"><rect width="20" height="20" fill="${fill - Network accessline 51
const file=path.join(dir,`background-${i}.svg`); fs.writeFileSync(file,`<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"><rect width="20" height="20" fill="${fill}"/></svg>`); return file; - Network accessline 52
fs.writeFileSync(file,`<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"><rect width="20" height="20" fill="${fill}"/></svg>`); - Network accessline 78
test('zero or multiple images preserve authored order at any chat position', async () => { const src='data:image/svg+xml;base64,'+Buffer.from('<svg xmlns="http://www.w3.org/2000/svg" width="160" height="90"><rect width="160" height="90" f - Network accessline 79
const src='data:image/svg+xml;base64,'+Buffer.from('<svg xmlns="http://www.w3.org/2000/svg" width="160" height="90"><rect width="160" height="90" fill="#557799"/></svg>').toString('base64'); - Network accessline 119
const t=fixture(); t.messages.push(...Array.from({length:14},(_,i)=>({id:`long${i}`,type:'text',from:i%2?'peer':'me', text:'This longer message wraps safely inside the phone, including https://example.test/a-very-long-word-wit - Network accessline 120
t.messages.push(...Array.from({length:14},(_,i)=>({id:`long${i}`,type:'text',from:i%2?'peer':'me', text:'This longer message wraps safely inside the phone, including https://example.test/a-very-long-word-without-spaces.'}))); - Network accessline 121
text:'This longer message wraps safely inside the phone, including https://example.test/a-very-long-word-without-spaces.'})));
skills/video/render-imessage-chat/tests/test_safe_area.js
- Executable scriptline 1
Executable file
skills/video/render-imessage-chat/tests/test_stitch.py
skills/video/render-ios-keyboard/generate.js
- Executable scriptline 1
#!/usr/bin/env node
skills/video/render-ios-keyboard/render.js
- Executable scriptline 1
#!/usr/bin/env node
skills/video/render-logo-equation-card/scripts/_fonts.py
- Executable scriptline 1
Executable file - Network accessline 16
} ROBOTO = {"bold": "Roboto-Bold.ttf", "regular": "Roboto-Regular.ttf", "italic": "Roboto-Italic.ttf"} BASE = "https://github.com/google/fonts/raw/main/apache/roboto/static/" - Network accessline 17
ROBOTO = {"bold": "Roboto-Bold.ttf", "regular": "Roboto-Regular.ttf", "italic": "Roboto-Italic.ttf"} BASE = "https://github.com/google/fonts/raw/main/apache/roboto/static/" CACHE = pathlib.Path(os.path.expanduser("~/.cache/gooseworks/fonts" - Network accessline 18
BASE = "https://github.com/google/fonts/raw/main/apache/roboto/static/" - Network accessline 30
if not p.exists(): CACHE.mkdir(parents=True, exist_ok=True) urllib.request.urlretrieve(BASE + ROBOTO[k], p) - Network accessline 31
CACHE.mkdir(parents=True, exist_ok=True) urllib.request.urlretrieve(BASE + ROBOTO[k], p) hit = str(p) - Network accessline 32
urllib.request.urlretrieve(BASE + ROBOTO[k], p)
skills/video/render-logo-equation-card/scripts/compose.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-logo-equation-card/scripts/measure_motion.py
skills/video/render-logo-equation-card/scripts/render_card.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-model-comparison-grid/scripts/build_composition.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-model-comparison-grid/scripts/render_seekable_hyperframe.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-mosaic-grid-reveal/scripts/_shared.js
- Executable scriptline 1
Executable file
skills/video/render-mosaic-grid-reveal/scripts/build_html.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 142
</div> <div id="end"> <div id="wordmark"><svg viewBox="{vb}" fill="currentColor" xmlns="http://www.w3.org/2000/svg">{wm_inner}</svg></div> - Network accessline 143
<div id="end"> <div id="wordmark"><svg viewBox="{vb}" fill="currentColor" xmlns="http://www.w3.org/2000/svg">{wm_inner}</svg></div> <div id="sub">{ec.get('sub','')}</div> - Network accessline 144
<div id="wordmark"><svg viewBox="{vb}" fill="currentColor" xmlns="http://www.w3.org/2000/svg">{wm_inner}</svg></div>
skills/video/render-mosaic-grid-reveal/scripts/render.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-multiworld/scripts/PIPELINE.md
- Network accessline 76
### `music` → one ElevenLabs bed (curl → ElevenLabs, PAID)
skills/video/render-myth-vs-fact/scripts/beat_snap.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-myth-vs-fact/scripts/compose.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-myth-vs-fact/scripts/hyperframes/_shared.js
- Executable scriptline 1
Executable file
skills/video/render-myth-vs-fact/scripts/hyperframes/beat-hook.html
- Network accessline 3
<meta charset="utf-8" /> <title>beat · Hook</title> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 4
<title>beat · Hook</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 5
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 6
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 7
<link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
skills/video/render-myth-vs-fact/scripts/hyperframes/beat-myth-fact.html
- Network accessline 3
<meta charset="utf-8" /> <title>beat · Myth -> Fact</title> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 4
<title>beat · Myth -> Fact</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 5
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 6
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 7
<link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
skills/video/render-myth-vs-fact/scripts/hyperframes/beat-proof.html
- Network accessline 3
<meta charset="utf-8" /> <title>beat · Proof Reveal</title> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 4
<title>beat · Proof Reveal</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 5
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 6
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 7
<link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
skills/video/render-myth-vs-fact/scripts/hyperframes/beat-punch.html
- Network accessline 3
<meta charset="utf-8" /> <title>beat · Punch</title> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 4
<title>beat · Punch</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 5
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 6
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 7
<link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
skills/video/render-myth-vs-fact/scripts/hyperframes/beat-turn.html
- Network accessline 3
<meta charset="utf-8" /> <title>beat · The Turn</title> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 4
<title>beat · The Turn</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 5
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 6
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 7
<link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
skills/video/render-myth-vs-fact/scripts/make_captions.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-myth-vs-fact/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/render-myth-vs-fact/scripts/render_beats.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-narrated-ugc-wardrobe-stitch/scripts/config.example.json
- Network accessline 78
"landing_page": { "_comment": "The sale/CTA scroll cuts (s24-s26) are a Playwright render of the brand's real landing page (2160x3840 @ 2x DSR) -> FFmpeg zoompan. NOT i2v. Zoom targets: wide -> bundle price card -> Order-now button.", - Network accessline 79
"_comment": "The sale/CTA scroll cuts (s24-s26) are a Playwright render of the brand's real landing page (2160x3840 @ 2x DSR) -> FFmpeg zoompan. NOT i2v. Zoom targets: wide -> bundle price card -> Order-now button.", "url": "https://www - Network accessline 80
"url": "https://www.sunnook.example/",
skills/video/render-offer-ad/project/package.json
- Executable scriptline 1
Executable file
skills/video/render-offer-ad/project/remotion.config.ts
- Executable scriptline 1
Executable file
skills/video/render-offer-ad/project/src/Main.tsx
- Executable scriptline 1
Executable file
skills/video/render-offer-ad/project/src/Root.tsx
- Executable scriptline 1
Executable file
skills/video/render-offer-ad/project/src/fonts.ts
- Executable scriptline 1
Executable file
skills/video/render-offer-ad/project/src/index.ts
- Executable scriptline 1
Executable file
skills/video/render-offer-ad/project/src/lib/anim.ts
- Executable scriptline 1
Executable file
skills/video/render-offer-ad/project/src/props.ts
- Executable scriptline 1
Executable file
skills/video/render-offer-ad/project/src/scenes/Scene01.tsx
- Executable scriptline 1
Executable file
skills/video/render-offer-ad/project/src/scenes/Scene02.tsx
- Executable scriptline 1
Executable file
skills/video/render-offer-ad/project/src/scenes/Scene03.tsx
- Executable scriptline 1
Executable file
skills/video/render-offer-ad/project/src/scenes/Scene04.tsx
- Executable scriptline 1
Executable file
skills/video/render-offer-ad/scripts/render.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/recipe.json
- Network accessline 355
"title": "Podcast skit: payroll for building firms (split)", "ratio": "9:16", "media_url": "https://d2m0qbg34x1ii2.cloudfront.net/ads/samples/6eb98bf4-802e-4156-a443-1d15be0bd02b/media-master-split.mp4", - Network accessline 356
"ratio": "9:16", "media_url": "https://d2m0qbg34x1ii2.cloudfront.net/ads/samples/6eb98bf4-802e-4156-a443-1d15be0bd02b/media-master-split.mp4", "thumbnail_url": "https://d2m0qbg34x1ii2.cloudfront.net/ads/samples/14a8882f-1618-4473-bd - Network accessline 357
"media_url": "https://d2m0qbg34x1ii2.cloudfront.net/ads/samples/6eb98bf4-802e-4156-a443-1d15be0bd02b/media-master-split.mp4", - Network accessline 358
"thumbnail_url": "https://d2m0qbg34x1ii2.cloudfront.net/ads/samples/14a8882f-1618-4473-bd20-c4146d38630c/media-poster.jpg"
skills/video/render-podcast-skit/scripts/build_overlays.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/check_framing_render.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/compose_master.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/config_io.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/cost_model.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/crop_singles.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/gates.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 1207
continue head = p.open("rb").read(64) if head.startswith(b"version https://git-lfs"): - Network accessline 1208
head = p.open("rb").read(64) if head.startswith(b"version https://git-lfs"): _fail(out, "asset_not_lfs_pointer", - Network accessline 1209
if head.startswith(b"version https://git-lfs"):
skills/video/render-podcast-skit/scripts/gen_paid.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/grade_episode.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/make_lockup.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/one_shot.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/pick_voices.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Network accessline 73
def library(tok): req = request.Request("https://api.elevenlabs.io/v1/voices?page_size=100", - Network accessline 74
req = request.Request("https://api.elevenlabs.io/v1/voices?page_size=100",
skills/video/render-podcast-skit/scripts/plan_beats.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/plan_cuts.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/preview_framing.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/provider_commands.py
- Executable scriptline 1
Executable file - Access to secretsline 30
[Credential-related source omitted] - Network accessline 93
if not p.is_file() or p.stat().st_size == 0: raise RuntimeError(f"Missing input: {p}") if p.read_bytes()[:80].startswith(b"version https://git-lfs.github.com/spec/v1"): - Network accessline 94
raise RuntimeError(f"Missing input: {p}") if p.read_bytes()[:80].startswith(b"version https://git-lfs.github.com/spec/v1"): raise RuntimeError(f"Input is an LFS pointer: {p}") - Network accessline 95
if p.read_bytes()[:80].startswith(b"version https://git-lfs.github.com/spec/v1"):
skills/video/render-podcast-skit/scripts/selftest.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 511
good_png = tmp / "overlays" / "cap-001.png" ptr = tmp / "pointer.png" ptr.write_bytes(b"version https://git-lfs.github.com/spec/v1\noid " - Network accessline 512
ptr = tmp / "pointer.png" ptr.write_bytes(b"version https://git-lfs.github.com/spec/v1\noid " b"sha256:" + b"0" * 64 + b"\nsize 481920\n") - Network accessline 513
ptr.write_bytes(b"version https://git-lfs.github.com/spec/v1\noid "
skills/video/render-podcast-skit/scripts/shape_vo.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-podcast-skit/scripts/test_distribution.py
- Executable scriptline 1
Executable file - Access to secretsline 29
[Credential-related source omitted] - Network accessline 100
audio.write_bytes(b"real-audio") proxy = mock.Mock() proxy.fal_upload.side_effect = ["https://example.test/still", "https://example.test/audio"] - Network accessline 101
proxy = mock.Mock() proxy.fal_upload.side_effect = ["https://example.test/still", "https://example.test/audio"] proxy.fal_generate_video.return_value = "https://example.test/clip" - Network accessline 102
proxy.fal_upload.side_effect = ["https://example.test/still", "https://example.test/audio"] - Network accessline 103
proxy.fal_generate_video.return_value = "https://example.test/clip" - Network accessline 108
self.assertEqual(provider_commands.main(), 0) proxy.fal_generate_video.assert_called_once_with("veed/fabric-1.0", { "image_url": "https://example.test/still", "audio_url": "https://example.test/audio", "resolution": "720 - Network accessline 109
proxy.fal_generate_video.assert_called_once_with("veed/fabric-1.0", { "image_url": "https://example.test/still", "audio_url": "https://example.test/audio", "resolution": "720p"}) proxy.download.assert_called_once_with("h - Network accessline 110
"image_url": "https://example.test/still", "audio_url": "https://example.test/audio", "resolution": "720p"}) - Network accessline 111
proxy.download.assert_called_once_with("https://example.test/clip", str(self.root / "clip.mp4")) - Network accessline 113
def test_image_edit_hosts_local_reference_before_canonical_generator(self): proxy = mock.Mock() proxy.fal_upload.return_value = "https://example.test/approved-plate" - Network accessline 114
proxy = mock.Mock() proxy.fal_upload.return_value = "https://example.test/approved-plate" args = ["provider_commands.py", "image", "--model", "gpt-image-2", - Network accessline 115
proxy.fal_upload.return_value = "https://example.test/approved-plate" - Network accessline 120
call = run.call_args.args[0] self.assertIn(str(self.root / "create-image-gpt-image-fal/scripts/generate.py"), call) self.assertEqual(call[call.index("--ref-url") + 1], "https://example.test/approved-plate") - Network accessline 121
self.assertIn(str(self.root / "create-image-gpt-image-fal/scripts/generate.py"), call) self.assertEqual(call[call.index("--ref-url") + 1], "https://example.test/approved-plate") self.assertNotIn("plate.png", call) - Network accessline 122
self.assertEqual(call[call.index("--ref-url") + 1], "https://example.test/approved-plate")
skills/video/render-proof-points-overlay/scripts/build_overlays.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-proof-points-overlay/scripts/compose_master.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-proof-points-overlay/scripts/fetch_icons.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 13
CDN = "https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/72x72" - Network accessline 30
print(f"[icons] have {name}") continue urllib.request.urlretrieve(f"{CDN}/{cp}.png", dst) - Network accessline 31
continue urllib.request.urlretrieve(f"{CDN}/{cp}.png", dst) print(f"[icons] {name} <- {cp}.png") - Network accessline 32
urllib.request.urlretrieve(f"{CDN}/{cp}.png", dst)
skills/video/render-proof-points-overlay/scripts/music_coverage.py
- Executable scriptline 1
Executable file
skills/video/render-proof-points-overlay/tests/test_layout.py
- Executable scriptline 1
Executable file
skills/video/render-proof-points-overlay/tests/test_music.py
- Executable scriptline 1
Executable file
skills/video/render-street-interview/SKILL.md
- Network accessline 116
The final Seedance prompt is built from the project brief and shared shot instructions. [BytePlus recommends at most 1,000 English words](https://docs.byteplus.com/en/docs/modelark/create-video-generation-task-api) - Network accessline 117
[BytePlus recommends at most 1,000 English words](https://docs.byteplus.com/en/docs/modelark/create-video-generation-task-api) - Network accessline 118
because lengthy prompts may miss details. This is quality guidance. The current [Fal schema](https://fal.ai/api/openapi/queue/openapi.json?endpoint_id=bytedance%2Fseedance-2.0%2Freference-to-video) declares no maximum prompt length; that do - Network accessline 119
[Fal schema](https://fal.ai/api/openapi/queue/openapi.json?endpoint_id=bytedance%2Fseedance-2.0%2Freference-to-video)
skills/video/render-street-interview/references/model-behaviors.md
- Network accessline 28
[BytePlus recommends at most 1,000 English words](https://docs.byteplus.com/en/docs/modelark/create-video-generation-task-api) - Network accessline 29
because longer prompts may miss details. [Fal's current reference-to-video schema](https://fal.ai/api/openapi/queue/openapi.json?endpoint_id=bytedance%2Fseedance-2.0%2Freference-to-video)
skills/video/render-street-interview/references/street-reference-library.json
- Network accessline 131
"observed": true, "observed_scope": "transcript", "source": "https://www.thisamericanlife.org/395/transcript", - Network accessline 132
"observed_scope": "transcript", "source": "https://www.thisamericanlife.org/395/transcript", "observed_at": "2026-10-02", - Network accessline 133
"source": "https://www.thisamericanlife.org/395/transcript",
skills/video/render-street-interview/scripts/bench.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-street-interview/scripts/brandkit.py
skills/video/render-street-interview/scripts/build.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-street-interview/scripts/build_episode.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-street-interview/scripts/build_looks.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-street-interview/scripts/check-cut.py
skills/video/render-street-interview/scripts/conversation.py
- Executable scriptline 1
Executable file
skills/video/render-street-interview/scripts/edit_timeline.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-street-interview/scripts/falsify-all.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-street-interview/scripts/fit_grade.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-street-interview/scripts/format_spec.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 1130
# Quality guidance, not an API maximum or a precise failure boundary. BytePlus recommends # at most 1000 English words because lengthy prompts may miss details: # https://docs.byteplus.com/en/docs/modelark/create-video-generation-task-api - Network accessline 1131
# at most 1000 English words because lengthy prompts may miss details: # https://docs.byteplus.com/en/docs/modelark/create-video-generation-task-api # Fal's reference-to-video schema declares no maxLength for prompt (checked 2026-10-03). - Network accessline 1132
# https://docs.byteplus.com/en/docs/modelark/create-video-generation-task-api
skills/video/render-street-interview/scripts/measure-pace.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-street-interview/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/render-street-interview/scripts/paths.py
skills/video/render-street-interview/scripts/phone_look_video.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-street-interview/scripts/prepare_script_context.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-street-interview/scripts/recut.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-street-interview/scripts/selftest.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-street-interview/scripts/single_gen.py
skills/video/render-street-interview/scripts/variants_gen.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 234
print(f" FAILED: {e}") continue urllib.request.urlretrieve(res["video"]["url"], dest) - Network accessline 235
continue urllib.request.urlretrieve(res["video"]["url"], dest) (out / f"{dest.stem}.json").write_text(json.dumps( - Network accessline 236
urllib.request.urlretrieve(res["video"]["url"], dest)
skills/video/render-street-interview/tests/test_cast_advice.py
- Executable scriptline 1
Executable file
skills/video/render-street-interview/tests/test_conversation.py
- Executable scriptline 1
Executable file - Network accessline 27
def ref(id="a", origin="seed"): return {"id":id,"origin":origin,"format":"street-interview","execution_modes":["conversation"], "language":"en","observed":True,"observed_scope":"video","source":"https://example.org/source", - Network accessline 28
return {"id":id,"origin":origin,"format":"street-interview","execution_modes":["conversation"], "language":"en","observed":True,"observed_scope":"video","source":"https://example.org/source", "commercial":True,"comme - Network accessline 29
"language":"en","observed":True,"observed_scope":"video","source":"https://example.org/source",
skills/video/render-street-interview/tests/test_edit_timeline.py
- Executable scriptline 1
Executable file
skills/video/render-street-interview/tests/test_finishing.py
- Executable scriptline 1
Executable file
skills/video/render-street-interview/tests/test_h3_provider_route.py
- Executable scriptline 1
Executable file - Access to secretsline 48
[Credential-related source omitted] - Network accessline 146
with patch.object(single_gen.urllib.request, "urlretrieve", side_effect=broken_download): with self.assertRaises(OSError): single_gen.download_take("https://example.invalid/video", dest) - Network accessline 147
with self.assertRaises(OSError): single_gen.download_take("https://example.invalid/video", dest) self.assertFalse(dest.exists()) - Network accessline 148
single_gen.download_take("https://example.invalid/video", dest)
skills/video/render-street-interview/tests/test_opt_in_hold_grammar.py
- Executable scriptline 1
Executable file
skills/video/render-street-interview/tests/test_prompt_budget.py
skills/video/render-street-interview/tests/test_recut_media.py
- Executable scriptline 1
Executable file
skills/video/render-street-interview/tests/test_selector_route.py
- Executable scriptline 1
Executable file
skills/video/render-street-interview/tests/test_single_gen_rejection.py
- Executable scriptline 1
Executable file - Network accessline 48
if path == "/cdn/files/upload": m.uploads += 1 url = "https://cdn.example/u%d.png" % m.uploads # a NEW url for every upload - Network accessline 49
m.uploads += 1 url = "https://cdn.example/u%d.png" % m.uploads # a NEW url for every upload m.url_content[url] = raw - Network accessline 50
url = "https://cdn.example/u%d.png" % m.uploads # a NEW url for every upload - Network accessline 57
if any(m.url_content.get(u) == BAD for u in body.get("image_urls", [])): return self.send(422, LIKENESS) q = "https://queue.fal.run/%s/requests/ok-%d" % (path[len(prefix):], len(m.submits)) - Network accessline 58
return self.send(422, LIKENESS) q = "https://queue.fal.run/%s/requests/ok-%d" % (path[len(prefix):], len(m.submits)) return self.send(200, {"request_id": "ok", "status_url": q + "/status", "response_url": q}) - Network accessline 59
q = "https://queue.fal.run/%s/requests/ok-%d" % (path[len(prefix):], len(m.submits)) - Possible obfuscationline 66
return self.send(200, b"\x00\x00\x00\x18ftypmp42", "video/mp4") - Network accessline 75
self.httpd = http.server.ThreadingHTTPServer(("127.0.0.1", 0), _Handler) self.httpd.mock = self self.base = "http://127.0.0.1:%d" % self.httpd.server_port - Network accessline 76
self.httpd.mock = self self.base = "http://127.0.0.1:%d" % self.httpd.server_port threading.Thread(target=self.httpd.serve_forever, daemon=True).start() - Network accessline 77
self.base = "http://127.0.0.1:%d" % self.httpd.server_port - Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 96
[Credential-related source omitted]
skills/video/render-street-interview/tests/test_skin_and_voice_options.py
- Executable scriptline 1
Executable file
skills/video/render-value-prop/SKILL.md
- Access to secretsline 33
[Credential-related source omitted]
skills/video/render-value-prop/scripts/build_storyboard_preview.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 83
<meta charset="utf-8"> <title>Beat {id} — {slug}</title> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 84
<title>Beat {id} — {slug}</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 85
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 86
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 87
<link href="https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&display=swap" rel="stylesheet"> - Network accessline 262
<meta charset="utf-8"> <title>{brand_name} Value Prop Storyboard</title> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 263
<title>{brand_name} Value Prop Storyboard</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 264
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 265
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 266
<link href="https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&display=swap" rel="stylesheet">
skills/video/render-value-prop/scripts/build_text_overlays.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 75
<meta charset="utf-8"> <title>Overlay Beat {id}</title> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 76
<title>Overlay Beat {id}</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 77
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 78
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 79
<link href="https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&display=swap" rel="stylesheet"> - Network accessline 136
<meta charset="utf-8"> <title>Overlay Endcard</title> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 137
<title>Overlay Endcard</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 138
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 139
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 140
<link href="https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&display=swap" rel="stylesheet">
skills/video/render-value-prop/scripts/render_hyperframe.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-value-prop/scripts/render_master.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 24
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted]
skills/video/render-value-prop/shared/_shared.css
- Network accessline 8
@import url("https://api.fontshare.com/v2/css?f[]=general-sans@200,300,400,500,600,700&f[]=switzer@300,400,500,600,700&display=swap");
skills/video/render-value-prop/shared/_shared.js
- Executable scriptline 1
Executable file
skills/video/render-value-prop/shared/animations/sachet-entrance/cascade-from-top.js
- Executable scriptline 1
Executable file
skills/video/render-value-prop/shared/animations/sachet-entrance/fade-stagger.js
- Executable scriptline 1
Executable file
skills/video/render-value-prop/shared/animations/sachet-entrance/slide-in-lateral.js
- Executable scriptline 1
Executable file
skills/video/render-value-prop/shared/animations/sachet-entrance/springScale-pop.js
- Executable scriptline 1
Executable file
skills/video/render-value-prop/shared/animations/sachet-entrance/tilt-fan.js
- Executable scriptline 1
Executable file
skills/video/render-value-prop/shared/animations/text-entrance/fade-stagger.js
- Executable scriptline 1
Executable file
skills/video/render-value-prop/shared/animations/text-entrance/mask-reveal.js
- Executable scriptline 1
Executable file
skills/video/render-value-prop/shared/animations/text-entrance/type-on.js
- Executable scriptline 1
Executable file
skills/video/render-value-prop/shared/animations/text-entrance/word-by-word.js
- Executable scriptline 1
Executable file
skills/video/render-vignette/scripts/composite_variants.py
skills/video/render-vignette/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/render-vignette/scripts/music_and_mux.py
skills/video/render-vignette/scripts/render_overlays.py
skills/video/render-vignette/scripts/strip_product_backgrounds.py
skills/video/render-whiteboard-explainer/assets/fonts/NOTICE.md
- Network accessline 6
| File | Family | Licence | Source | | --- | --- | --- | --- | | `PermanentMarker-Regular.ttf` | Permanent Marker, by Font Diner | Apache License 2.0 | https://fonts.google.com/specimen/Permanent+Marker | - Network accessline 7
| --- | --- | --- | --- | | `PermanentMarker-Regular.ttf` | Permanent Marker, by Font Diner | Apache License 2.0 | https://fonts.google.com/specimen/Permanent+Marker | | `TitanOne-Regular.ttf` | Titan One, by Rodrigo Fuenzalida | SIL Open F - Network accessline 8
| `PermanentMarker-Regular.ttf` | Permanent Marker, by Font Diner | Apache License 2.0 | https://fonts.google.com/specimen/Permanent+Marker | - Network accessline 9
| `TitanOne-Regular.ttf` | Titan One, by Rodrigo Fuenzalida | SIL Open Font License 1.1 | https://fonts.google.com/specimen/Titan+One |
skills/video/render-whiteboard-explainer/scripts/anchors.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-whiteboard-explainer/scripts/gen-art.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-whiteboard-explainer/scripts/gen-voice.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 78
import requests api_base, tok, agent = media_proxy._cfg() resp = requests.post(api_base + "/api/internal/elevenlabs-proxy" + path, - Network accessline 79
api_base, tok, agent = media_proxy._cfg() resp = requests.post(api_base + "/api/internal/elevenlabs-proxy" + path, params=media_proxy._params(tok, agent), json=body, timeout=300) - Network accessline 80
resp = requests.post(api_base + "/api/internal/elevenlabs-proxy" + path, - Possible obfuscationline 85
(OUT / "vo.mp3").write_bytes(base64.b64decode(res["audio_base64"]))
skills/video/render-whiteboard-explainer/scripts/illos.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-whiteboard-explainer/scripts/lettering.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-whiteboard-explainer/scripts/make-episode.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-whiteboard-explainer/scripts/master.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-whiteboard-explainer/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/render-whiteboard-explainer/scripts/prep-plate.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-whiteboard-explainer/scripts/render.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-whiteboard-explainer/scripts/solve-layout.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-whiteboard-explainer/scripts/trace.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/render-whiteboard-explainer/tests/test_whiteboard_portable.py
- Executable scriptline 1
Executable file - Network accessline 64
png.write_bytes(b"x") Path(str(png) + ".meta.json").write_text( json.dumps({"image_url": "https://example.invalid/scoop.png"}), encoding="utf-8") - Network accessline 65
Path(str(png) + ".meta.json").write_text( json.dumps({"image_url": "https://example.invalid/scoop.png"}), encoding="utf-8") assert g.public_url(png) == "https://example.invalid/scoop.png" - Network accessline 66
json.dumps({"image_url": "https://example.invalid/scoop.png"}), encoding="utf-8") - Network accessline 67
assert g.public_url(png) == "https://example.invalid/scoop.png"
skills/video/review-finished-ad/scripts/review_finished_ad.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/review-finished-ad/tests/test_overrun_freeze_clicks.py
- Executable scriptline 1
Executable file
skills/video/review-finished-ad/tests/test_review_finished_ad.py
- Executable scriptline 1
Executable file - Network accessline 268
pytest.skip("no SVG rasteriser installed") svg = tmp / "logo.svg" svg.write_text('<svg xmlns="http://www.w3.org/2000/svg" width="600" height="200">' - Network accessline 269
svg = tmp / "logo.svg" svg.write_text('<svg xmlns="http://www.w3.org/2000/svg" width="600" height="200">' '<circle cx="100" cy="100" r="90" fill="#1438c8"/>' - Network accessline 270
svg.write_text('<svg xmlns="http://www.w3.org/2000/svg" width="600" height="200">'
skills/video/review-finished-ad/tests/test_sampling.py
- Executable scriptline 1
Executable file
skills/video/review-finished-ad/tests/test_silent_text_profile.py
- Executable scriptline 1
Executable file
skills/video/review-ugc-render/SKILL.md
skills/video/review-ugc-render/scripts/review_render.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 871
[Credential-related source omitted] - Access to secretsline 873
[Credential-related source omitted] - Access to secretsline 875
[Credential-related source omitted] - Access to secretsline 880
[Credential-related source omitted] - Access to secretsline 887
[Credential-related source omitted] - Access to secretsline 905
[Credential-related source omitted] - Access to secretsline 922
[Credential-related source omitted] - Network accessline 927
[Credential-related source omitted] - Access to secretsline 927
[Credential-related source omitted] - Access to secretsline 928
[Credential-related source omitted] - Network accessline 929
[Credential-related source omitted] - Access to secretsline 929
[Credential-related source omitted] - Access to secretsline 932
[Credential-related source omitted] - Access to secretsline 936
[Credential-related source omitted] - Access to secretsline 959
[Credential-related source omitted] - Access to secretsline 961
[Credential-related source omitted]
skills/video/review-ugc-render/tests/test_review_render.py
- Executable scriptline 1
Executable file - Network accessline 199
("Visit www.example.com today", "Visit www dot example dot com today", {}, True), ("Visit www.example.com today", "Visit example dot com today", {}, True), ("Visit https://example.com/shop", "Visit example dot com slash shop - Network accessline 200
("Visit www.example.com today", "Visit example dot com today", {}, True), ("Visit https://example.com/shop", "Visit example dot com slash shop", {}, True), ("Try talentloop.ai", "Try talentloop dot a i", {}, True), - Network accessline 201
("Visit https://example.com/shop", "Visit example dot com slash shop", {}, True), - Access to secretsline 625
[Credential-related source omitted] - Network accessline 628
[Credential-related source omitted] - Network accessline 629
[Credential-related source omitted] - Network accessline 630
[Credential-related source omitted] - Access to secretsline 630
[Credential-related source omitted] - Access to secretsline 632
[Credential-related source omitted] - Network accessline 633
[Credential-related source omitted] - Access to secretsline 633
[Credential-related source omitted] - Network accessline 634
[Credential-related source omitted] - Access to secretsline 634
[Credential-related source omitted] - Network accessline 635
assert review_render._gw_creds() == ("https://example.invalid", "k", "a") - Access to secretsline 636
[Credential-related source omitted] - Access to secretsline 641
[Credential-related source omitted] - Access to secretsline 643
[Credential-related source omitted]
skills/video/stitch-videos-ffmpeg/scripts/composite.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/stitch-videos-ffmpeg/scripts/composite_final.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/stitch-videos-ffmpeg/scripts/composite_final.sh
- Executable scriptline 1
#!/usr/bin/env bash
skills/video/stitch-videos-ffmpeg/scripts/montage.py
skills/video/stitch-videos-ffmpeg/scripts/normalize_clip.sh
- Executable scriptline 1
#!/usr/bin/env bash
skills/video/stitch-videos-ffmpeg/scripts/trim_clips.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/stitch-videos-ffmpeg/scripts/voiceless/composite.py
- Executable scriptline 1
Executable file
skills/video/stitch-videos-ffmpeg/tests/test_stitch_montage.py
skills/video/stitch-videos-ffmpeg/tests/test_trim_clips.py
- Executable scriptline 1
Executable file
skills/video/ugc-fixloop/scripts/stitch_replacement.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/ugc-fixloop/scripts/vet_seedance_prompt.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Network accessline 103
**({"project_id": pid} if pid else {})}) url = f"{api_base}/api/internal/openai-proxy/v1/chat/completions?{q}" req = urllib.request.Request(url, data=json.dumps(body).encode(), - Network accessline 104
url = f"{api_base}/api/internal/openai-proxy/v1/chat/completions?{q}" req = urllib.request.Request(url, data=json.dumps(body).encode(), headers={"Content-Type": "application/json"}, method="POST") - Network accessline 105
req = urllib.request.Request(url, data=json.dumps(body).encode(), - Network accessline 106
headers={"Content-Type": "application/json"}, method="POST") try: with urllib.request.urlopen(req, timeout=180) as resp: - Network accessline 107
try: with urllib.request.urlopen(req, timeout=180) as resp: out = json.loads(resp.read().decode()) - Network accessline 108
with urllib.request.urlopen(req, timeout=180) as resp:
skills/video/video-production-harness/references/speech-and-route-qualification.md
- Network accessline 122
unproven candidates, not defaults; Omni ignores uploaded audio, so never route exact lip-sync through it. Sources: [ElevenLabs models](https://elevenlabs.io/docs/overview/models), - Network accessline 123
lip-sync through it. Sources: [ElevenLabs models](https://elevenlabs.io/docs/overview/models), [Google Omni](https://ai.google.dev/gemini-api/docs/omni.md), - Network accessline 124
[ElevenLabs models](https://elevenlabs.io/docs/overview/models), - Network accessline 125
[Google Omni](https://ai.google.dev/gemini-api/docs/omni.md), - Network accessline 126
[Seedance 2.5](https://seed.bytedance.com/en/seedance2_5).
skills/video/video-production-harness/scripts/assemble.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/video-production-harness/scripts/assemble_sources.py
- Executable scriptline 1
Executable file
skills/video/video-production-harness/scripts/assembly_timeline.py
- Executable scriptline 1
Executable file
skills/video/video-production-harness/scripts/check_recipe.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/video-production-harness/scripts/final_grade.py
- Executable scriptline 1
Executable file
skills/video/video-production-harness/scripts/final_measure.py
- Executable scriptline 1
Executable file
skills/video/video-production-harness/scripts/final_measure_parts.py
- Executable scriptline 1
Executable file
skills/video/video-production-harness/scripts/pack_recipe.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/video-production-harness/scripts/qc_evidence.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/video-production-harness/scripts/reference_rate.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/video-production-harness/scripts/reference_shots.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/video-production-harness/scripts/timeline_rules.py
- Executable scriptline 1
Executable file
skills/video/write-video-ad-script/references/files.md
- Network accessline 171
"quotes": [ {"id": "q1", "text": "I was waking up at 3am every single night and staring at the ceiling", "source": "https://…", "kind": "review", "rating": 5, "tag": "moment"}, - Network accessline 172
{"id": "q1", "text": "I was waking up at 3am every single night and staring at the ceiling", "source": "https://…", "kind": "review", "rating": 5, "tag": "moment"}, {"id": "q2", "text": "the smell is calm, not fake spa lavender", - Network accessline 173
"source": "https://…", "kind": "review", "rating": 5, "tag": "moment"}, - Network accessline 174
{"id": "q2", "text": "the smell is calm, not fake spa lavender", "source": "https://…", "kind": "comment", "tag": "outcome"} ] - Network accessline 175
"source": "https://…", "kind": "comment", "tag": "outcome"} - Network accessline 198
{ "id": "conversation-1", "url": "https://publisher.example/interview", - Network accessline 199
"id": "conversation-1", "url": "https://publisher.example/interview", "dialogue_mode": "podcast", - Network accessline 200
"url": "https://publisher.example/interview", - Network accessline 236
[ {"id": "r1", "source": "format demo", "url": "https://…", - Network accessline 237
{"id": "r1", "source": "format demo", "url": "https://…",
skills/video/write-video-ad-script/references/human-behavior.md
- Network accessline 89
[John August's dialogue article](https://johnaugust.com/2007/how-to-write-dialogue) models - Network accessline 90
listening before replying and revises an information dump into a locally triggered reply. [Writing Excuses](https://writingexcuses.com/17-31-everyone-has-an-agenda/) distinguishes the author's purpose from each character's purpose. These ar - Network accessline 91
[Writing Excuses](https://writingexcuses.com/17-31-everyone-has-an-agenda/) distinguishes
skills/video/write-video-ad-script/references/judge-contract.md
- Network accessline 21
The current [TypeSafe model documentation](https://docs.typesafe.ai/models) describes - Network accessline 159
- [TypeSafe introduction](https://docs.typesafe.ai/introduction): atomic judgments and - Network accessline 160
independent parallel questions. - [Models](https://docs.typesafe.ai/models): current version, text input, context and pricing. - [Confidence](https://docs.typesafe.ai/confidence): uncertainty statistics and routing. - Network accessline 161
- [Models](https://docs.typesafe.ai/models): current version, text input, context and pricing. - Network accessline 162
- [Confidence](https://docs.typesafe.ai/confidence): uncertainty statistics and routing. - Network accessline 163
- [Judging LLM as a Judge](https://arxiv.org/abs/2306.05685): position and other judge biases;
skills/video/write-video-ad-script/references/scene-and-hook.md
- Network accessline 22
| Primary source | What it supports | What it does not establish | | --- | --- | --- | | [NBCU Academy: street interviews](https://nbcuacademy.com/street-interview/) | Journalists explain their purpose, connect the approach to the person or - Network accessline 23
| --- | --- | --- | | [NBCU Academy: street interviews](https://nbcuacademy.com/street-interview/) | Journalists explain their purpose, connect the approach to the person or setting, and listen for the next question. | A commercial ad templ - Network accessline 24
| [NBCU Academy: street interviews](https://nbcuacademy.com/street-interview/) | Journalists explain their purpose, connect the approach to the person or setting, and listen for the next question. | A commercial ad template, conversion perf - Network accessline 25
| [Hannah Williams: Salary Transparent Street](https://www.creatorspotlight.com/p/hannah-williams-salary-transparent-street) | The creator describes a clear purpose and permission before filming a short interview; visible branding helps ide - Network accessline 26
| [YouTube: Jenny Hoyos and Todd Sherman on Shorts](https://blog.youtube/creator-and-artist-stories/youtube-shorts-deep-dive/) | The creator emphasizes the opening and a short story that delivers on the interest it creates. | A universal ne - Network accessline 27
| [TikTok Creative Codes](https://ads.tiktok.com/business/en-US/creative-codes) | Plan hook, body and close together; picture, movement, text and sound can carry the opening. | That adding a provocative sentence makes an otherwise confusing - Network accessline 28
| [Faber Academy: dialogue](https://faberacademy.com/reading-room/writing-exercises/how-to-write-better-dialogue/) | Intentions, relationships and the moment shape what people say. Read dialogue aloud; avoid characters explaining facts sole - Network accessline 36
Source: [Salary Transparent Street: Chicago PhD student](https://www.snapchat.com/@sts.ca/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbnRlZGNmd2Z0AZy5cBqDAZy5cBoBAAAAAQ).
skills/video/write-video-ad-script/scripts/critique_scripts.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/write-video-ad-script/scripts/lint_scripts.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/write-video-ad-script/scripts/media_proxy.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 76
"""'https://api.x/api/internal/fal-proxy' → 'https://api.x' (None if not a proxy URL).""" - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 247
[Credential-related source omitted] - Network accessline 257
body["details"] = details try: requests.post(api_base + "/api/internal/cli-logs", - Network accessline 258
try: requests.post(api_base + "/api/internal/cli-logs", params=_params(tok, agent), json=body, timeout=5) - Network accessline 259
requests.post(api_base + "/api/internal/cli-logs", - Access to secretsline 525
[Credential-related source omitted] - Access to secretsline 684
[Credential-related source omitted] - Access to secretsline 701
[Credential-related source omitted] - Network accessline 718
while time.time() < deadline: try: return requests.get(url, params=params, timeout=60) - Network accessline 719
try: return requests.get(url, params=params, timeout=60) except _TRANSIENT as e: - Network accessline 720
return requests.get(url, params=params, timeout=60) - Access to secretsline 746
[Credential-related source omitted] - Network accessline 887
prompt = payload.get("prompt") if isinstance(payload, dict) else None try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Network accessline 888
try: sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, headers=headers or None, timeout=120) - Network accessline 889
sub_resp = requests.post(f"{base}/{model_path}", params=params, json=payload, - Access to secretsline 984
[Credential-related source omitted] - Network accessline 1019
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1020
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"prompt": prompt, "music_length_ms": int(music_length_ms), - Network accessline 1021
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Access to secretsline 1048
[Credential-related source omitted] - Access to secretsline 1049
[Credential-related source omitted] - Network accessline 1058
p = pathlib.Path(path) ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1059
ctype = content_type or mimetypes.guess_type(p.name)[0] or "application/octet-stream" r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", params={**_params(tok, agent), "storage_type" - Network accessline 1060
r = requests.post(api_base + "/api/internal/fal-storage-proxy/storage/auth/token", - Network accessline 1064
t = r.json() with open(p, "rb") as f: up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1065
[Credential-related source omitted] - Network accessline 1066
up = requests.post(t["base_url"].rstrip("/") + "/files/upload", data=f, timeout=600, - Network accessline 1078
urllib.request.urlretrieve(url, out_path) - Network accessline 1091
t0 = time.time() try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, - Network accessline 1092
try: r = requests.post(url, params=_params(tok, agent), timeout=timeout_s, json={"text": text, "model_id": model_id}) - Network accessline 1093
r = requests.post(url, params=_params(tok, agent), timeout=timeout_s,
skills/video/write-video-ad-script/scripts/prepare_angle_context.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/write-video-ad-script/scripts/verify_handoff.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/video/write-video-ad-script/tests/test_angle_handoff.py
- Executable scriptline 1
Executable file - Network accessline 19
"objective": "purchase", "offer": None, "cta": "Shop the bottle", "facts": [{"id": "f1", "product_id": "bottle", "text": "A screw-top lid", "source": "https://example.com/bottle", "verified_at": "2026-10-02"}], - Network accessline 20
"facts": [{"id": "f1", "product_id": "bottle", "text": "A screw-top lid", "source": "https://example.com/bottle", "verified_at": "2026-10-02"}], "quotes": [], "references": [], - Network accessline 21
"source": "https://example.com/bottle", "verified_at": "2026-10-02"}], - Network accessline 62
def dialogue_reference(mode="podcast"): return {"id": "r-dialogue", "url": "https://publisher.example/interview", - Network accessline 63
return {"id": "r-dialogue", "url": "https://publisher.example/interview", - Network accessline 181
bank = copy.deepcopy(BANK) bank["quotes"] = [{"id": "q1", "text": "I keep it beside my laptop", "source": "https://example.com/review"}] - Network accessline 182
bank["quotes"] = [{"id": "q1", "text": "I keep it beside my laptop", "source": "https://example.com/review"}] angle = bank["angles"][0] - Network accessline 183
"source": "https://example.com/review"}] - Network accessline 242
def test_product_claims_cannot_use_a_customer_quote_as_general_substantiation(): c, s, x = fixture() x["quotes"] = [{"id": "q1", "text": "Mine never spilled", "source": "https://example.com/review"}] - Network accessline 243
c, s, x = fixture() x["quotes"] = [{"id": "q1", "text": "Mine never spilled", "source": "https://example.com/review"}] c["concepts"][0]["claims"] = [{"text": "Never spills", "fact_ids": ["q1"]}] - Network accessline 244
x["quotes"] = [{"id": "q1", "text": "Mine never spilled", "source": "https://example.com/review"}] - Network accessline 300
def test_context_quotes_are_validated_without_a_second_bank_file(): c, s, x = fixture() x["quotes"] = [{"id": "q1", "text": "I keep it beside my laptop", "source": "https://example.com/review"}] - Network accessline 301
c, s, x = fixture() x["quotes"] = [{"id": "q1", "text": "I keep it beside my laptop", "source": "https://example.com/review"}] c["concepts"][0]["quote_ids"] = ["unknown"] - Network accessline 302
x["quotes"] = [{"id": "q1", "text": "I keep it beside my laptop", "source": "https://example.com/review"}]
skills/video/write-video-ad-script/tests/test_creative_brief.py
- Executable scriptline 1
Executable file
skills/video/write-video-ad-script/tests/test_critique_scripts.py
skills/video/write-video-ad-script/tests/test_handoff_release.py
- Executable scriptline 1
Executable file
skills/video/write-video-ad-script/tests/test_lint_scripts.py
- Executable scriptline 1
Executable file - Network accessline 34
} BANK = {"quotes": [ {"id": "q1", "text": "I was waking up at 3am every single night and staring at the ceiling", "source": "https://example.com/r/1"}, - Network accessline 35
BANK = {"quotes": [ {"id": "q1", "text": "I was waking up at 3am every single night and staring at the ceiling", "source": "https://example.com/r/1"}, {"id": "q2", "text": "the smell is calm, not fake spa lavender", "source": "https - Network accessline 36
{"id": "q1", "text": "I was waking up at 3am every single night and staring at the ceiling", "source": "https://example.com/r/1"}, - Network accessline 37
{"id": "q2", "text": "the smell is calm, not fake spa lavender", "source": "https://example.com/r/2"},
skills/video/write-video-ad-script/tests/test_pacing.py
- Executable scriptline 1
Executable file
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 9 facts
- Contacts cdn.syndication.twimg.com, which SKILL.md, the README and the plugin manifest do not mentiongoose-graphics/screenshot/fetch-tweet.js:41High confidence
- Contacts rube.app, which SKILL.md, the README and the plugin manifest do not mentionjob-posting-intent/scripts/create_sheet.py:11High confidence
- Contacts docs.google.com, which SKILL.md, the README and the plugin manifest do not mentionjob-posting-intent/scripts/create_sheet.py:64High confidence
- Contacts rube.app, which SKILL.md, the README and the plugin manifest do not mentionjob-posting-intent/scripts/create_sheet_mcp.py:13High confidence
- Contacts docs.google.com, which SKILL.md, the README and the plugin manifest do not mentionjob-posting-intent/scripts/create_sheet_mcp.py:116High confidence
- Contacts sheets.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionjob-posting-intent/scripts/create_sheet_mcp.py:164High confidence
- Contacts rube.app, which SKILL.md, the README and the plugin manifest do not mentionjob-posting-intent/scripts/search_jobs.py:52High confidence
- Contacts docs.google.com, which SKILL.md, the README and the plugin manifest do not mentionjob-posting-intent/scripts/search_jobs.py:549High confidence
- Contacts sheets.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionjob-posting-intent/scripts/search_jobs.py:596High confidence
Signal confidence: 491 facts
- Executable script in code of a file that runsscripts/build-router.js:1High confidence
- Executable script in code of a file that runsscripts/build-router.js:1High confidence
- Executable script in code of a file that runsscripts/build-router.js:1High confidence
- Network access in prose of documentationimprove-search-visibility/references/citation-protocol.md:23Low confidence
- Network access in prose of documentationskills/marketing/improve-search-visibility/references/citation-protocol.md:23Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:26Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:26Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:27Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:27Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:28Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:28Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:29Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:29Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:30Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:30Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:31Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:31Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:32Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:32Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:33Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:33Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:34Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:34Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:35Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:35Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:42Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:42Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:43Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:43Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:44Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:44Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:45Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:45Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:47Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:47Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:48Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:48Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:49Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:49Low confidence
- Network access in code of documentationimprove-search-visibility/references/finished-fix-examples.md:50Low confidence
- Network access in code of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:50Low confidence
- Network access in prose of documentationimprove-search-visibility/references/finished-fix-examples.md:59Low confidence
- Network access in prose of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:59Low confidence
- Network access in prose of documentationimprove-search-visibility/references/finished-fix-examples.md:60Low confidence
- Network access in prose of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:60Low confidence
- Network access in prose of documentationimprove-search-visibility/references/finished-fix-examples.md:61Low confidence
- Network access in prose of documentationskills/marketing/improve-search-visibility/references/finished-fix-examples.md:61Low confidence
- Network access in prose of documentationimprove-search-visibility/references/foundation-check.md:7Low confidence
- Network access in prose of documentationskills/marketing/improve-search-visibility/references/foundation-check.md:7Low confidence
- Network access in prose of documentationimprove-search-visibility/references/foundation-check.md:8Low confidence
and 441 more
Only the first 500 facts are listed.
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest skills/entry/.claude-plugin/plugin.json | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest docs/marketing/AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md drafts/marketing/learn-my-brand/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md drafts/marketing/learn-my-brand/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md drafts/marketing/learn-my-brand/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md drafts/marketing/learn-my-brand/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.
Explore alternatives and comparisons
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/gooseworks-ai-goose-skills/)