算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
brand-research【设计与创意】Kickoff research for a brand you haven't worked on before — web research, existing-ad analysis from the Meta Ad Library, editorial-grammar profiling, sourced + AI-generated brand assets, hook/CTA libraries, and an ad concept brief. Produces one reusable brand-context pack (brand-summary, visual-identity, competitors, audience, existing-ads, brand-gra…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Given a brand (name and/or URL) and a product, produce the full creative-prep package for it: research the product, analyze the brand's running ads, measure their editorial DNA, source logos and reference photos, generate brand-anchored product + lifestyle imagery, and write the brand-context documents a downstream ad/video pipeline consumes.
The output is a brand-context pack — a self-contained set of artifacts:
brand-summary, visual-identity, competitors, audience — the core brand context.existing-ads — what the brand's running ads reveal that web research misses.brand-grammar — the brand's editorial DNA (archetype, pacing, caption style).Everything is written into a single brand-pack directory under output_dir.
brand (required) — the brand, used as the pack's folder name, e.g. amex, liquid-death.product (required) — the specific product / SKU / offer to research, e.g. "Platinum
Card", "Sparkling Water". Disambiguates brands with many SKUs.brand_url (optional) — canonical homepage. Strongly recommended to avoid wrong-entity
confusion (e.g. Apple band vs. Apple Inc.).output_dir (optional) — directory to write the brand pack into. Defaults to ./<brand>/.
Resolve the location from this input; never hardcode a path.max_existing_ads (optional, default 10) — cap on how many of the brand's running Meta
ads to pull for analysis.brand_video_urls (optional) — the brand's own video URLs (launch films, demos). If
provided, run build-brand-clip-library afterward to cut them into a reusable clip library.concept_count (optional, default 6–10) — number of social-ad concepts to draft.skip_generation (optional, default false) — skip image generation and ship research +
brief only (useful when no image budget is available).source-company-existing-ads — download the brand's running ads from the Meta Ad
Library (via the Apify FB Ad Library scraper) into a raw/ folder with provenance.rename-and-index-ads — watch each downloaded ad, semantically rename it, and write an
INDEX.md (per-ad strategy + cross-ad patterns).analyze-reference-grammar — measure each ad's editorial DNA (cut points, pacing curve,
archetype, audio mode) into a per-ad grammar-profile.json.source-brand-assets — scrape logos + reference hero photos from the brand's site / press kit.understand-brand-assets — distill web research + reference photos into the visual-identity
content (colors, typography, photography style).analyze-ad-hooks — extract recurring hooks/motifs from the downloaded ads.generate-ad-concepts — produce the concept list for the concept brief.create-product-images-higgsfield-product-photoshoot — 4–6 hero/end-card product stills
(Higgsfield product-photoshoot on gpt_image_2).create-product-images-nanobanana — 8–12 vertical 9:16 lifestyle stills (Nano Banana Pro).yt-dlp + ffmpeg + Whisper), and web search + fetch.brand + product resolves to one entity. If brand_url is
missing and the name is ambiguous, stop and ask.<output_dir> — a brand-research/ folder for the
markdown docs, a brand-assets/ folder for the asset manifest + binaries (logos/,
reference-photos/, generated-product-shots/, generated-lifestyle/, songs/), and an
existing-ads/ folder (raw/ + renamed copies + a grammar/ subfolder). Only create
subfolders that will be populated.source-company-existing-ads (max_ads=max_existing_ads) to pull the brand's Meta
Ad Library ads into the existing-ads/raw/ folder. Manual fallback per that atom's docs.rename-and-index-ads to produce semantically named copies + an INDEX.md (per-ad
strategy + cross-ad patterns synthesis).existing-ads.md in step 7.analyze-reference-grammar on each renamed ad. Each run
emits a grammar-profile.json carrying the ad's archetype match + confidence,
cuts_per_10s[], mean shot length, payoff-hold ratio, audio mode, and aspect. These
per-ad profiles are the input to brand-grammar.md in step 7 — the brand's editorial
DNA, so a from-scratch ad can inherit the brand's cut rhythm and archetype defaults.existing-ads.md AND brand-grammar.md ("No live Meta ads found as of — grammar
defaults will be picked at design-brief time") and continue.source-brand-assets:
brand-assets/logos/.brand-assets/reference-photos/. Mark "not licensed for redistribution" in each
manifest entry's description.brand-assets/songs/.skip_generation=true):
create-product-images-higgsfield-product-photoshoot,
grounded on the strongest reference photo so the SKU stays consistent →
brand-assets/generated-product-shots/.create-product-images-nanobanana (Nano Banana Pro), 2k
vertical 9:16, same reference grounding → brand-assets/generated-lifestyle/.kind
(logo | wordmark | product_photo | lifestyle | video_ref | style_ref | ui_ref | song | asset), a short name to search by, and a description of how/when to use it plus any
usage constraint (e.g. "not licensed for redistribution" on scraped photos). A vague
description defeats the file's purpose. Write it as brand-assets/manifest.json.brand-summary.md — What the company sells, Who they sell to, Why people buy (jobs-to-be-done), Brand voice in three words, What to never say.visual-identity.md — Primary colors (hex), Typography, Logo usage rules,
Photography style, Off-limits styles.competitors.md — ## Direct (each competitor: one-line positioning, pricing tier,
and how <brand> wins / loses vs them) and ## Reference creative (links / vibes to
emulate or avoid).audience.md — Primary persona, Where they spend time online, Objections they raise, Proof points that land. Include 3–4 distinct ICP segments and verbatim audience
phrasing (Reddit/forums) — these become VO seeds downstream.existing-ads.md — narrative synthesis of what the brand's running ads (step 4)
reveal that web research misses. Headers: Ads watched (count + date range + link to
existing-ads/INDEX.md), How the product actually shows up on screen, Recurring hooks and angles, Claims and proof the brand consistently leans on, Who's shown using it,
Objections the ads pre-empt, Voice & caption treatment, Implications for new ads.
INDEX.md stays the per-ad catalog; this file is the synthesized read.brand-grammar.md — the editorial DNA synthesized from the per-ad
grammar-profile.json files. Headers: Dominant archetype (which creator-grammar
archetype the brand favors — e.g. creator-talking-head, vo-product-demo,
founder-monologue — with the per-ad split), Pacing curve (mean cuts_per_10s across
ads, range, payoff-hold use), Audio mode (music-only / vo+music / speech-only mix),
Caption family (burned karaoke / static lower-thirds / on-screen text bursts / none),
Hook construction (first 1.5s pattern), Defaults for new ads (recommended archetype +
cuts_per_10s target + caption preset a from-scratch ad should inherit). Human-readable
seeding, not a machine contract — pick the archetype from a small fixed vocabulary you
define up front and reuse across brands.asset-urls.md — every sourced URL with its access date (the provenance trail).ui-references.md — ONLY if the product has notable in-app/product UI worth
recreating; catalog the key screens. Omit the file entirely otherwise.concept-brief.md with sections: Observed patterns from existing ads (only if
step 4 ran), Strategic foundation, Concept ideas (concept_count, each with hook + format
brand-research/video-research.json — a machine-readable companion that mirrors
the deep-research findings from existing-ads.md + brand-grammar.md so a host can ingest
them without parsing prose. Shape: { competitors:[{name,relationship,notes}], existingAds:{count,source,recurringHooks[],recurringClaims[],talentProfile, objectionsPreempted[]}, grammar:{dominantArchetype,cutsPer10s,audioMode,captionFamily, hookConstruction}, hooks:[{line,archetype,sourceAds[]}], ctas:[{line,intent,sourceAds[]}] }.
Omit fields you don't have; write the file only when ≥1 ad was analyzed (skip on the "no
live ads" path). The markdown docs stay the human-readable source; this is their structured
echo.gpt_image_2 → nano_banana_2).description in the manifest.existing-ads.md per step 4 and omit the "Observed patterns" section of
the concept brief.brand_video_urls is provided), run the sibling molecule build-brand-clip-library.The brand-context pack:
brand-research/brand-summary.mdbrand-research/visual-identity.mdbrand-research/competitors.mdbrand-research/audience.mdbrand-research/existing-ads.mdbrand-research/brand-grammar.mdbrand-research/asset-urls.mdbrand-research/video-research.json (structured echo of existing-ads + brand-grammar; only when ≥1 ad was analyzed)brand-research/ui-references.md (only when the product has notable UI)brand-assets/ — the asset manifest + populated logos/, reference-photos/, and
(unless skipped) generated-product-shots/, generated-lifestyle/, songs/existing-ads/ — raw/ originals, semantically renamed copies, INDEX.md, and
grammar/<slug>/grammar-profile.json per adconcept-brief.mdbrand-research/*.md files (brand-summary, visual-identity,
competitors, audience, existing-ads, brand-grammar) exist with no remaining
placeholder markers and use the exact section headers above.existing-ads.md and brand-grammar.md either reference a populated INDEX.md + per-ad
grammar-profile.json files (≥1 ad watched) or carry the explicit "No live Meta ads found"
stub — never silently empty.brand-grammar.md names a Dominant archetype that maps to one of the fixed creator-grammar
archetypes and gives concrete numeric cuts_per_10s defaults (not "fast" / "snappy" prose).existing-ads/ contains raw/ originals, renamed copies, an INDEX.md whose per-ad blocks
were filled by watching the files (not guessed from filenames), and per-ad
grammar-profile.json.asset-urls.md cites real, dated sources for every research claim and sourced asset.path is relative
to the brand pack and resolves to a real file; every kind is in the allowed enum; no entry
is missing name/description.brand_url was not provided → refuse.existing-ads.md and continue rather than halting.INDEX.md, skip that
file, continue.