[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-anthropic-canva-creator":3,"mdc--e9apgr-key":40,"related-repo-anthropic-canva-creator":1697,"related-org-anthropic-canva-creator":1812},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":29,"repoUrl":30,"updatedAt":31,"license":32,"forks":33,"topics":34,"repo":35,"sourceUrl":38,"mdContent":39},"canva-creator","execute end-to-end marketing campaigns","Takes an approved content brief and executes a campaign end-to-end: builds the posting calendar, generates Canva designs for social posts, drafts caption and email copy, and stages social sends in HubSpot. Canva is used for social posts only (Instagram, Facebook, X, LinkedIn) — email content is drafted as plain text and surfaced inline for the owner to send from their own tool. Every step requires explicit owner approval. Use when the user says \"make the content,\" \"generate the posts,\" \"create the assets,\" \"turn this into a campaign,\" or hands off an approved brief for execution.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"anthropic","Anthropic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fanthropic.png","anthropics",[13,17,20,23,26],{"name":14,"slug":15,"type":16},"Content Creation","content-creation","tag",{"name":18,"slug":19,"type":16},"Marketing","marketing",{"name":21,"slug":22,"type":16},"Canva","canva",{"name":24,"slug":25,"type":16},"Social Media","social-media",{"name":27,"slug":28,"type":16},"Email Marketing","email-marketing",22885,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins","2026-05-14T06:03:02.69298",null,2736,[],{"repoUrl":30,"stars":29,"forks":33,"topics":36,"description":37},[],"Open source repository of plugins primarily intended for knowledge workers to use in Claude Cowork","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Ftree\u002FHEAD\u002Fsmall-business\u002Fskills\u002Fcanva-creator","---\nname: canva-creator\ndescription: >\n  Takes an approved content brief and executes a campaign end-to-end: builds\n  the posting calendar, generates Canva designs for social posts, drafts\n  caption and email copy, and stages social sends in HubSpot. Canva is used\n  for social posts only (Instagram, Facebook, X, LinkedIn) — email content\n  is drafted as plain text and surfaced inline for the owner to send from\n  their own tool. Every step requires explicit owner approval. Use when the\n  user says \"make the content,\" \"generate the posts,\" \"create the assets,\"\n  \"turn this into a campaign,\" or hands off an approved brief for execution.\n---\n\n# Canva Creator\n\n## Scope\n\nThis skill handles a campaign in five sequential stages, each gated by owner\napproval:\n\n```\nbrief → calendar → asset inventory → Canva designs → copy → HubSpot staging\n```\n\n| Path | Channels | What this skill produces |\n|------|----------|--------------------------|\n| Canva (social) | Instagram, Facebook, X\u002FTwitter, LinkedIn | Canva design + caption + scheduled HubSpot post |\n| Text-only | Email (newsletter, marketing, drip) | Subject + preheader + body, surfaced inline for the owner to send |\n\n**Canva is not used for email rows under any circumstance** — no templates,\nno autofill, no design copies, no asset uploads, no exports. The owner\nexplicitly descoped Canva from the email path because email-template\nautofill produces placeholder graphics when image slots exceed available\nphotos, and variation thumbnails fail to render in chat previews. If the\nowner asks for a Canva email design, see `reference\u002Fgotchas.md` for the\nredirect language.\n\n---\n\n## Pre-flight\n\nBefore Stage 1, confirm:\n\n1. **Brief.** The user has referenced or pasted an approved brief. If not:\n   \"I'll need the content brief before I can build the campaign. Do you\n   have one from the content-strategy skill, or would you like to write\n   one now?\"\n\n2. **Canva tier.** Pro\u002FTeams require manual template selection from the\n   user's library (no autofill API). Enterprise can autofill from brand\n   templates.\n\n3. **HubSpot tier.** Social staging requires Marketing Hub Professional.\n   Starter or Free → skip Stage 5 and export a CSV instead\n   (see [reference\u002Fhubspot-staging.md](reference\u002Fhubspot-staging.md)).\n\n4. **Brand assets.** Confirm the path to product photos on disk or that\n   the brand kit is live in Canva.\n\n5. **Generation budget.** Estimate the campaign's Canva volume and surface\n   it before Stage 1 begins. Default is 3 candidates per Canva-bound row;\n   each design costs ~5 API calls (autofill + export + polling).\n\n   ```\n   Generation budget for this campaign:\n     Canva (social) rows: 8\n     Candidates per row:  3   (default — say \"single candidate\" to use 1)\n     Total designs:       24\n     API calls (approx):  ~120  (autofill + export + polling)\n\n   Canva limit: 100 requests\u002Fminute. This will take ~2-3 minutes of\n   generation, well within your tier limits. Proceed?\n   ```\n\n   If the projected total designs exceeds 30, recommend single-candidate\n   mode upfront — large campaigns run out of headroom fast. The owner can\n   override the default to 1, 2, or 3 candidates per row before Stage 1\n   starts. Lock the chosen value for the entire session.\n\n---\n\n## Workflow\n\n### Stage 1 — Posting calendar\n\nPull from the brief: content themes, channels, cadence, hard dates\n(launches, sales, holidays).\n\nBuild a calendar table with a `Path` column that routes every row to either\nCanva or text-only drafting:\n\n| Date | Channel | Path | Theme | Asset type | Caption\u002FSubject angle |\n|------|---------|------|-------|------------|-----------------------|\n| Jun 2 | Instagram feed | Canva (social) | Linen launch | Square post | \"finally, a dress…\" |\n| Jun 5 | Email | Text-only | Linen launch | Email body | \"Linen that actually breathes\" |\n\nTag every email-channel row as `Text-only` before presenting. Cap at 30\ndays unless the brief specifies otherwise. Flag scheduling conflicts (two\nposts same day for the same product) up front.\n\n**Checkpoint 1.** Present the calendar. Ask: \"Does this match the plan?\nAny dates to shift, channels to add, or themes to swap?\" Iterate until\napproved, then restate the split out loud — \"N rows go through Canva, M\nrows go through text-only drafting\" — before moving on. Catching a\nmiscategorization here is free; catching it after generating designs\nisn't.\n\n---\n\n### Stage 2 — Asset inventory (Canva rows only)\n\nEmail rows skip this stage entirely. For each `Canva (social)` row, build\na manifest of what the template needs and what's already available.\n\n1. **Enumerate every image slot by name.** Square Instagram posts usually\n   have 1-2 image slots; carousels and product grids can have 5+. List\n   them individually (`Header_Image`, `Product1_Image`, `Product2_Image`,\n   …) — never roll them up as \"product images.\"\n   - Enterprise: read field names from `dataset[].label` on the brand\n     template (`GET \u002Fv1\u002Fbrand-templates\u002F{id}`).\n   - Pro\u002FTeams: count every distinct image rectangle in the template.\n\n2. **Inventory available assets.** Text content from the brief (product\n   names, offer copy, taglines, pricing), product photos already uploaded\n   to Canva (`GET \u002Fv1\u002Fassets`) or on the owner's disk, brand kit colors\n   and fonts (Enterprise).\n\n3. **Build the slot-by-slot gap table.** One row per slot per design — not\n   per design.\n\n   | Date | Slot name | Slot kind | Available asset | Status |\n   |------|-----------|-----------|-----------------|--------|\n   | Jun 2 | Hero_Image | image | bloom_summer.jpg → asset_id pending | upload |\n   | Jun 2 | Headline | text | \"Summer linen, finally\" | ready |\n   | Jun 9 | Product1_Image | image | — | **MISSING** |\n\n4. **Resolve slot\u002Fasset mismatches with the owner.** If the template has\n   more image slots than the brief provides photos, pause and ask:\n\n   ```\n   The \"Summer Carousel\" template has 5 image slots. The brief gave me 1\n   photo (bloom_summer.jpg). How should I fill the other 4?\n\n     1. Reuse the same photo across all 5 slots\n     2. You send me 4 more photos (file paths)\n     3. Pick a simpler template with fewer slots\n   ```\n\n   No generation calls until the owner picks. Generating with empty slots\n   produces designs full of Canva's default landscape placeholders.\n\n5. **Upload missing photos and capture verified asset IDs.** Upload via\n   `POST \u002Fv1\u002Fasset-uploads`, then poll `GET \u002Fv1\u002Fasset-uploads\u002F{job_id}`\n   until `status == \"success\"`. Record `asset.id` from the response — this\n   is the only value that works in an autofill image field. Passing an\n   empty string, a URL, a file path, or a stale ID silently renders\n   Canva's stock landscape graphic instead of the photo.\n\n6. **Confirm the manifest.** Show the owner the completed slot-by-slot\n   table with every slot resolved and every image `asset.id` confirmed.\n   This is the last stop before Canva API calls.\n\n---\n\n### Stage 3 — Canva design generation\n\nBefore any Canva API call, re-read the calendar and drop any row whose\n`Path` is not `Canva (social)`. Email rows do not pass through this\nstage.\n\nGenerate designs **one calendar row at a time**, with 3 candidates per row\n(or the value chosen at pre-flight). Each row follows the same loop:\ngenerate candidates → verify → export → visually check → retry failures\n→ present → wait for owner pick → next row. Pause 30 seconds between\nrows. This caps the burst at 3 generations + 3 exports per ~30s — well\nunder Canva's 100 req\u002Fmin rate limit. Do not parallelize multiple rows;\none row at a time is the protection that keeps the owner from hitting\nquota mid-campaign.\n\n**Polling cadence.** Poll job status every 3-5 seconds, not faster.\nTighter intervals burn quota without speeding up completion.\n\n**Preview URLs — only one type is safe to embed.** Autofill responses\nreturn `design.canva.ai` thumbnails that expire within minutes; embedding\nthem as markdown images produces broken \"Show Image\" placeholders.\nPermanent export URLs (`export-download.canva.com` or the `export-design`\nMCP tool) do not expire. Native Cowork carousels render the autofill\nresult directly using the connector's authenticated session — let them\nrender on their own, don't re-embed.\n\n#### Row loop\n\n1. **Resolve template.** (Once per session — same template across rows\n   unless the calendar mixes asset types.)\n   - Enterprise: `GET \u002Fv1\u002Fbrand-templates` filtered by asset type.\n   - Pro\u002FTeams: `GET \u002Fv1\u002Fdesigns?ownership=any&query={template name}`,\n     surface top 3 to the owner, confirm one before generating.\n\n2. **Generate the row's candidates in parallel.** Fire the row's 3\n   candidates simultaneously (or N from pre-flight).\n   - Enterprise: `POST \u002Fv1\u002Fautofills` per candidate with the template ID\n     and field values. Poll all jobs concurrently.\n   - Pro\u002FTeams: `POST \u002Fv1\u002Fdesigns` to create copies. Describe the text and\n     image edits the owner applies in Canva; collect design IDs back.\n\n3. **Verify job status.** For each candidate, confirm\n   `GET \u002Fautofills\u002F{job_id}` returned `status == \"success\"` and\n   `result.design.id` is present. Handle errors per-design:\n   - `JOB_FAILED` → read `job.error.message`, fix the field values or\n     asset IDs, retry once.\n   - `RATE_LIMIT_EXCEEDED` (first hit this session) → wait 60s, retry\n     that one candidate once. This handles transient spikes.\n   - `RATE_LIMIT_EXCEEDED` (second hit this session) **or** any\n     `quota_exceeded` \u002F daily-cap error → stop generation immediately.\n     Do not retry. Surface progress and ask:\n\n     ```\n     Canva is rate-limiting the campaign. Status so far:\n       ✓ Generated:  Posts 1-4 (12 designs)\n       ⏸ Remaining:  Posts 5-8 (12 designs not yet generated)\n\n     How should I proceed?\n       1. Switch to 1 candidate per remaining row (4 designs total) — finishes now\n       2. Pause campaign — resume in 60 minutes when quota refills\n       3. Stop generation — work with what we have, move to captions\n     ```\n\n     Wait for the owner's choice. Do not loop on retry.\n\n4. **Export each successful candidate to a permanent PNG.** Fire the\n   row's exports in parallel.\n   - REST: `POST \u002Fv1\u002Fexports` with `format.type: \"png\"`, poll\n     `GET \u002Fv1\u002Fexports\u002F{job_id}` until success, capture `urls[0]`.\n   - Canva MCP: `export-design` with the design ID.\n\n   These permanent URLs are what get embedded in previews and attached to\n   the HubSpot post later. The autofill response thumbnail is never used\n   downstream.\n\n5. **Visually verify each export.** Look at the image and reject any of\n   these — they all indicate an unfilled slot or wrong asset:\n   - Generic landscape with clouds and green hills (Canva's default\n     placeholder)\n   - Solid gray rectangles where a photo should be\n   - Lorem-ipsum or template-default text\n   - Subject that doesn't match the brief (wrong product, wrong brand)\n\n   If a candidate fails verification: re-check the manifest for the\n   affected slot, fix the `asset.id`, regenerate that single candidate,\n   re-export, re-verify.\n\n6. **Retry per-candidate on partial failure.** If 1 of N candidates in\n   the row failed at Step 3 or 5, regenerate just that one — don't redo\n   the whole row and don't present a partial broken carousel. If the\n   second attempt also fails:\n\n   ```\n   The third candidate for the Jun 9 post keeps failing — Canva returned\n   [error \u002F rendered placeholder]. How should I proceed?\n\n     1. Skip it — present the other 2 and move on\n     2. Swap to a simpler template for just this candidate\n     3. Try once more with a different photo\n   ```\n\n7. **Present the row's candidates.** Let the native Cowork carousel\n   render the autofill tool result. Below it, add a text prompt:\n\n   ```\n   Jun 9 candidates are ready — scroll through the carousel above.\n   Which one should I use for the Jun 9 post?\n   ```\n\n   If the carousel doesn't render or one position is broken, embed the\n   permanent export PNG URLs from Step 4 instead. Final fallback: link to\n   the design's Canva edit URL (`https:\u002F\u002Fwww.canva.com\u002Fd\u002F{design_id}`).\n   Never re-embed `design.canva.ai` URLs.\n\n8. **Pause 30 seconds, then move to the next row.**\n\n**Checkpoint 2.** Satisfied once the owner has picked one design per\ncalendar row. If they want a regenerate, regenerate only that one\ncandidate.\n\n---\n\n### Stage 4 — Copy drafting\n\nFor each calendar row, draft the copy. Social rows get a caption; email\nrows get a full email.\n\n**Social captions** — Instagram, Facebook, X, LinkedIn:\n\n- Length: channel-appropriate (Instagram ≤ 2,200 chars; Facebook ≤ 500\n  recommended; X ≤ 280).\n- Structure: hook → one product benefit → CTA → 3-5 hashtags (not 30).\n- Voice: match the brief's tone markers. If the brief says \"casual and\n  friendly,\" don't write corporate copy.\n- No filler. No \"Exciting news!\" or \"We're thrilled to announce.\" Open\n  with the value.\n\n**Email content** — Claude writes the entire email; no Canva:\n\n- Subject: ≤ 50 chars, specific, no clickbait. \"Spring projects are\n  booking up\" beats \"Don't miss out!\"\n- Preheader: ≤ 90 chars, complements the subject without repeating it.\n- Body: plain prose, 100-250 words. Opening line that earns the read →\n  1-2 paragraphs of substance → single clear CTA → sign-off.\n- Voice: same tone markers as social. Owners want their emails to sound\n  like them, not like a templated newsletter.\n- No image references. Don't write \"see image above.\" If the owner wants\n  visuals, they add them in their email tool.\n- One CTA per email. Pick the most important action and lead with it.\n\nPresent captions inline below each social row. Present full emails\ninline below each email row:\n\n```\nSubject: \u003Csubject line>\nPreheader: \u003Cpreheader text>\n\n\u003Cbody text>\n```\n\nFor worked examples, see\n[reference\u002Fexamples\u002Fboutique-brief-campaign.md](reference\u002Fexamples\u002Fboutique-brief-campaign.md).\n\n**Checkpoint 3.** \"Any captions or emails to rewrite? Flag the date and\nwhat to change.\" Iterate until approved.\n\n---\n\n### Stage 5 — HubSpot staging + email handoff\n\nStage social posts in HubSpot. Email content is not staged — it's\nsurfaced inline for the owner to copy into their email tool. For API\nfield reference, see\n[reference\u002Fhubspot-staging.md](reference\u002Fhubspot-staging.md).\n\n1. **Create the campaign.** `POST \u002Fmarketing\u002Fv3\u002Fcampaigns` with the\n   campaign name and start\u002Fend dates from the calendar.\n\n2. **Stage each social post.** `POST` to the HubSpot Social API per\n   `Canva (social)` row:\n   - `channel`: map calendar channel to HubSpot account ID\n   - `scheduledAt`: ISO 8601 datetime — confirm it's in the future before\n     calling\n   - `content.body`: approved caption\n   - `attachments`: permanent Canva export PNG URL from Stage 3\n   - `status`: `SCHEDULED` (never `PUBLISHED`)\n\n3. **Confirm the queue.** Call\n   `GET \u002Fmarketing\u002Fv3\u002Fsocial\u002Fposts?status=SCHEDULED`, surface the list,\n   provide a direct link to the HubSpot campaign view.\n\n4. **Surface email content for handoff.** For each email row, present the\n   approved subject + preheader + body inline, grouped by send date. The\n   owner copies these into their email tool (HubSpot Marketing Email,\n   Mailchimp, Gmail).\n\n**Final checkpoint.**\n\n```\nYour social posts are scheduled in HubSpot: [link]\nThey'll go out as scheduled — you can cancel or edit any post in HubSpot.\n\nEmail content is drafted below — copy each into your email tool when\nyou're ready to send:\n\n  Jun 5 — \"Spring projects are booking up\"\n  Jul 15 — \"Summer maintenance windows are filling\"\n\nAnything to change before we're done?\n```\n\n---\n\n## Approval gates\n\n- **No Canva calls for email rows.** Re-check the `Path` column before\n  every API call.\n- **No publishing.** Every HubSpot post is staged as `SCHEDULED`; the\n  owner controls go-live.\n- **Always surface the generation budget at pre-flight.** Owner sees the\n  total design count and approves before Stage 1 begins.\n- **One row at a time in Stage 3.** Candidates within a row fire in\n  parallel, but rows are sequential with a 30s gap — this is the quota\n  protection.\n- **On the second quota error, pause and ask.** Never loop on retry.\n- **Always export to a permanent PNG before presenting.** Job success\n  doesn't mean the design rendered correctly.\n- **Never embed `design.canva.ai` URLs in messages.** They expire.\n- **Never regenerate the whole row when one candidate fails.**\n  Per-candidate retry only.\n- **Never auto-select a template for Pro\u002FTeams users.** Always confirm.\n- **Never skip slot-by-slot inventory.** Multi-slot templates render\n  placeholder landscapes when any slot is empty.\n- **Never skip Checkpoint 1.** Generating before the calendar is approved\n  is the largest source of wasted work in this skill.\n\n---\n\n## Reference\n\n- [reference\u002Fcanva-api.md](reference\u002Fcanva-api.md) — Canva Connect API\n  endpoints, asset upload, export formats, MCP equivalents\n- [reference\u002Fhubspot-staging.md](reference\u002Fhubspot-staging.md) — HubSpot\n  Social API and CSV fallback for non-Pro tiers\n- [reference\u002Fgotchas.md](reference\u002Fgotchas.md) — Good \u002F Bad patterns for\n  every failure mode this skill has hit in production\n- [reference\u002Fexamples\u002Fboutique-brief-campaign.md](reference\u002Fexamples\u002Fboutique-brief-campaign.md)\n  — full worked examples (single-slot social, multi-slot template)\n",{"data":41,"body":42},{"name":4,"description":6},{"type":43,"children":44},"root",[45,53,60,66,79,148,167,171,177,182,260,263,269,276,281,293,397,409,419,422,428,440,734,737,743,762,774,784,818,825,1187,1197,1200,1206,1211,1221,1244,1254,1287,1292,1301,1312,1322,1325,1331,1341,1488,1496,1505,1508,1514,1648,1651,1657],{"type":46,"tag":47,"props":48,"children":49},"element","h1",{"id":4},[50],{"type":51,"value":52},"text","Canva Creator",{"type":46,"tag":54,"props":55,"children":57},"h2",{"id":56},"scope",[58],{"type":51,"value":59},"Scope",{"type":46,"tag":61,"props":62,"children":63},"p",{},[64],{"type":51,"value":65},"This skill handles a campaign in five sequential stages, each gated by owner\napproval:",{"type":46,"tag":67,"props":68,"children":72},"pre",{"className":69,"code":71,"language":51},[70],"language-text","brief → calendar → asset inventory → Canva designs → copy → HubSpot staging\n",[73],{"type":46,"tag":74,"props":75,"children":77},"code",{"__ignoreMap":76},"",[78],{"type":51,"value":71},{"type":46,"tag":80,"props":81,"children":82},"table",{},[83,107],{"type":46,"tag":84,"props":85,"children":86},"thead",{},[87],{"type":46,"tag":88,"props":89,"children":90},"tr",{},[91,97,102],{"type":46,"tag":92,"props":93,"children":94},"th",{},[95],{"type":51,"value":96},"Path",{"type":46,"tag":92,"props":98,"children":99},{},[100],{"type":51,"value":101},"Channels",{"type":46,"tag":92,"props":103,"children":104},{},[105],{"type":51,"value":106},"What this skill produces",{"type":46,"tag":108,"props":109,"children":110},"tbody",{},[111,130],{"type":46,"tag":88,"props":112,"children":113},{},[114,120,125],{"type":46,"tag":115,"props":116,"children":117},"td",{},[118],{"type":51,"value":119},"Canva (social)",{"type":46,"tag":115,"props":121,"children":122},{},[123],{"type":51,"value":124},"Instagram, Facebook, X\u002FTwitter, LinkedIn",{"type":46,"tag":115,"props":126,"children":127},{},[128],{"type":51,"value":129},"Canva design + caption + scheduled HubSpot post",{"type":46,"tag":88,"props":131,"children":132},{},[133,138,143],{"type":46,"tag":115,"props":134,"children":135},{},[136],{"type":51,"value":137},"Text-only",{"type":46,"tag":115,"props":139,"children":140},{},[141],{"type":51,"value":142},"Email (newsletter, marketing, drip)",{"type":46,"tag":115,"props":144,"children":145},{},[146],{"type":51,"value":147},"Subject + preheader + body, surfaced inline for the owner to send",{"type":46,"tag":61,"props":149,"children":150},{},[151,157,159,165],{"type":46,"tag":152,"props":153,"children":154},"strong",{},[155],{"type":51,"value":156},"Canva is not used for email rows under any circumstance",{"type":51,"value":158}," — no templates,\nno autofill, no design copies, no asset uploads, no exports. The owner\nexplicitly descoped Canva from the email path because email-template\nautofill produces placeholder graphics when image slots exceed available\nphotos, and variation thumbnails fail to render in chat previews. If the\nowner asks for a Canva email design, see ",{"type":46,"tag":74,"props":160,"children":162},{"className":161},[],[163],{"type":51,"value":164},"reference\u002Fgotchas.md",{"type":51,"value":166}," for the\nredirect language.",{"type":46,"tag":168,"props":169,"children":170},"hr",{},[],{"type":46,"tag":54,"props":172,"children":174},{"id":173},"pre-flight",[175],{"type":51,"value":176},"Pre-flight",{"type":46,"tag":61,"props":178,"children":179},{},[180],{"type":51,"value":181},"Before Stage 1, confirm:",{"type":46,"tag":183,"props":184,"children":185},"ol",{},[186,197,207,225,235],{"type":46,"tag":187,"props":188,"children":189},"li",{},[190,195],{"type":46,"tag":152,"props":191,"children":192},{},[193],{"type":51,"value":194},"Brief.",{"type":51,"value":196}," The user has referenced or pasted an approved brief. If not:\n\"I'll need the content brief before I can build the campaign. Do you\nhave one from the content-strategy skill, or would you like to write\none now?\"",{"type":46,"tag":187,"props":198,"children":199},{},[200,205],{"type":46,"tag":152,"props":201,"children":202},{},[203],{"type":51,"value":204},"Canva tier.",{"type":51,"value":206}," Pro\u002FTeams require manual template selection from the\nuser's library (no autofill API). Enterprise can autofill from brand\ntemplates.",{"type":46,"tag":187,"props":208,"children":209},{},[210,215,217,223],{"type":46,"tag":152,"props":211,"children":212},{},[213],{"type":51,"value":214},"HubSpot tier.",{"type":51,"value":216}," Social staging requires Marketing Hub Professional.\nStarter or Free → skip Stage 5 and export a CSV instead\n(see ",{"type":46,"tag":218,"props":219,"children":221},"a",{"href":220},"reference\u002Fhubspot-staging.md",[222],{"type":51,"value":220},{"type":51,"value":224},").",{"type":46,"tag":187,"props":226,"children":227},{},[228,233],{"type":46,"tag":152,"props":229,"children":230},{},[231],{"type":51,"value":232},"Brand assets.",{"type":51,"value":234}," Confirm the path to product photos on disk or that\nthe brand kit is live in Canva.",{"type":46,"tag":187,"props":236,"children":237},{},[238,243,245,254,258],{"type":46,"tag":152,"props":239,"children":240},{},[241],{"type":51,"value":242},"Generation budget.",{"type":51,"value":244}," Estimate the campaign's Canva volume and surface\nit before Stage 1 begins. Default is 3 candidates per Canva-bound row;\neach design costs ~5 API calls (autofill + export + polling).",{"type":46,"tag":67,"props":246,"children":249},{"className":247,"code":248,"language":51},[70],"Generation budget for this campaign:\n  Canva (social) rows: 8\n  Candidates per row:  3   (default — say \"single candidate\" to use 1)\n  Total designs:       24\n  API calls (approx):  ~120  (autofill + export + polling)\n\nCanva limit: 100 requests\u002Fminute. This will take ~2-3 minutes of\ngeneration, well within your tier limits. Proceed?\n",[250],{"type":46,"tag":74,"props":251,"children":252},{"__ignoreMap":76},[253],{"type":51,"value":248},{"type":46,"tag":255,"props":256,"children":257},"br",{},[],{"type":51,"value":259},"If the projected total designs exceeds 30, recommend single-candidate\nmode upfront — large campaigns run out of headroom fast. The owner can\noverride the default to 1, 2, or 3 candidates per row before Stage 1\nstarts. Lock the chosen value for the entire session.",{"type":46,"tag":168,"props":261,"children":262},{},[],{"type":46,"tag":54,"props":264,"children":266},{"id":265},"workflow",[267],{"type":51,"value":268},"Workflow",{"type":46,"tag":270,"props":271,"children":273},"h3",{"id":272},"stage-1-posting-calendar",[274],{"type":51,"value":275},"Stage 1 — Posting calendar",{"type":46,"tag":61,"props":277,"children":278},{},[279],{"type":51,"value":280},"Pull from the brief: content themes, channels, cadence, hard dates\n(launches, sales, holidays).",{"type":46,"tag":61,"props":282,"children":283},{},[284,286,291],{"type":51,"value":285},"Build a calendar table with a ",{"type":46,"tag":74,"props":287,"children":289},{"className":288},[],[290],{"type":51,"value":96},{"type":51,"value":292}," column that routes every row to either\nCanva or text-only drafting:",{"type":46,"tag":80,"props":294,"children":295},{},[296,331],{"type":46,"tag":84,"props":297,"children":298},{},[299],{"type":46,"tag":88,"props":300,"children":301},{},[302,307,312,316,321,326],{"type":46,"tag":92,"props":303,"children":304},{},[305],{"type":51,"value":306},"Date",{"type":46,"tag":92,"props":308,"children":309},{},[310],{"type":51,"value":311},"Channel",{"type":46,"tag":92,"props":313,"children":314},{},[315],{"type":51,"value":96},{"type":46,"tag":92,"props":317,"children":318},{},[319],{"type":51,"value":320},"Theme",{"type":46,"tag":92,"props":322,"children":323},{},[324],{"type":51,"value":325},"Asset type",{"type":46,"tag":92,"props":327,"children":328},{},[329],{"type":51,"value":330},"Caption\u002FSubject angle",{"type":46,"tag":108,"props":332,"children":333},{},[334,366],{"type":46,"tag":88,"props":335,"children":336},{},[337,342,347,351,356,361],{"type":46,"tag":115,"props":338,"children":339},{},[340],{"type":51,"value":341},"Jun 2",{"type":46,"tag":115,"props":343,"children":344},{},[345],{"type":51,"value":346},"Instagram feed",{"type":46,"tag":115,"props":348,"children":349},{},[350],{"type":51,"value":119},{"type":46,"tag":115,"props":352,"children":353},{},[354],{"type":51,"value":355},"Linen launch",{"type":46,"tag":115,"props":357,"children":358},{},[359],{"type":51,"value":360},"Square post",{"type":46,"tag":115,"props":362,"children":363},{},[364],{"type":51,"value":365},"\"finally, a dress…\"",{"type":46,"tag":88,"props":367,"children":368},{},[369,374,379,383,387,392],{"type":46,"tag":115,"props":370,"children":371},{},[372],{"type":51,"value":373},"Jun 5",{"type":46,"tag":115,"props":375,"children":376},{},[377],{"type":51,"value":378},"Email",{"type":46,"tag":115,"props":380,"children":381},{},[382],{"type":51,"value":137},{"type":46,"tag":115,"props":384,"children":385},{},[386],{"type":51,"value":355},{"type":46,"tag":115,"props":388,"children":389},{},[390],{"type":51,"value":391},"Email body",{"type":46,"tag":115,"props":393,"children":394},{},[395],{"type":51,"value":396},"\"Linen that actually breathes\"",{"type":46,"tag":61,"props":398,"children":399},{},[400,402,407],{"type":51,"value":401},"Tag every email-channel row as ",{"type":46,"tag":74,"props":403,"children":405},{"className":404},[],[406],{"type":51,"value":137},{"type":51,"value":408}," before presenting. Cap at 30\ndays unless the brief specifies otherwise. Flag scheduling conflicts (two\nposts same day for the same product) up front.",{"type":46,"tag":61,"props":410,"children":411},{},[412,417],{"type":46,"tag":152,"props":413,"children":414},{},[415],{"type":51,"value":416},"Checkpoint 1.",{"type":51,"value":418}," Present the calendar. Ask: \"Does this match the plan?\nAny dates to shift, channels to add, or themes to swap?\" Iterate until\napproved, then restate the split out loud — \"N rows go through Canva, M\nrows go through text-only drafting\" — before moving on. Catching a\nmiscategorization here is free; catching it after generating designs\nisn't.",{"type":46,"tag":168,"props":420,"children":421},{},[],{"type":46,"tag":270,"props":423,"children":425},{"id":424},"stage-2-asset-inventory-canva-rows-only",[426],{"type":51,"value":427},"Stage 2 — Asset inventory (Canva rows only)",{"type":46,"tag":61,"props":429,"children":430},{},[431,433,438],{"type":51,"value":432},"Email rows skip this stage entirely. For each ",{"type":46,"tag":74,"props":434,"children":436},{"className":435},[],[437],{"type":51,"value":119},{"type":51,"value":439}," row, build\na manifest of what the template needs and what's already available.",{"type":46,"tag":183,"props":441,"children":442},{},[443,505,523,651,675,717],{"type":46,"tag":187,"props":444,"children":445},{},[446,451,453,459,461,467,468,474,476],{"type":46,"tag":152,"props":447,"children":448},{},[449],{"type":51,"value":450},"Enumerate every image slot by name.",{"type":51,"value":452}," Square Instagram posts usually\nhave 1-2 image slots; carousels and product grids can have 5+. List\nthem individually (",{"type":46,"tag":74,"props":454,"children":456},{"className":455},[],[457],{"type":51,"value":458},"Header_Image",{"type":51,"value":460},", ",{"type":46,"tag":74,"props":462,"children":464},{"className":463},[],[465],{"type":51,"value":466},"Product1_Image",{"type":51,"value":460},{"type":46,"tag":74,"props":469,"children":471},{"className":470},[],[472],{"type":51,"value":473},"Product2_Image",{"type":51,"value":475},",\n…) — never roll them up as \"product images.\"",{"type":46,"tag":477,"props":478,"children":479},"ul",{},[480,500],{"type":46,"tag":187,"props":481,"children":482},{},[483,485,491,493,499],{"type":51,"value":484},"Enterprise: read field names from ",{"type":46,"tag":74,"props":486,"children":488},{"className":487},[],[489],{"type":51,"value":490},"dataset[].label",{"type":51,"value":492}," on the brand\ntemplate (",{"type":46,"tag":74,"props":494,"children":496},{"className":495},[],[497],{"type":51,"value":498},"GET \u002Fv1\u002Fbrand-templates\u002F{id}",{"type":51,"value":224},{"type":46,"tag":187,"props":501,"children":502},{},[503],{"type":51,"value":504},"Pro\u002FTeams: count every distinct image rectangle in the template.",{"type":46,"tag":187,"props":506,"children":507},{},[508,513,515,521],{"type":46,"tag":152,"props":509,"children":510},{},[511],{"type":51,"value":512},"Inventory available assets.",{"type":51,"value":514}," Text content from the brief (product\nnames, offer copy, taglines, pricing), product photos already uploaded\nto Canva (",{"type":46,"tag":74,"props":516,"children":518},{"className":517},[],[519],{"type":51,"value":520},"GET \u002Fv1\u002Fassets",{"type":51,"value":522},") or on the owner's disk, brand kit colors\nand fonts (Enterprise).",{"type":46,"tag":187,"props":524,"children":525},{},[526,531,533],{"type":46,"tag":152,"props":527,"children":528},{},[529],{"type":51,"value":530},"Build the slot-by-slot gap table.",{"type":51,"value":532}," One row per slot per design — not\nper design.",{"type":46,"tag":80,"props":534,"children":535},{},[536,566],{"type":46,"tag":84,"props":537,"children":538},{},[539],{"type":46,"tag":88,"props":540,"children":541},{},[542,546,551,556,561],{"type":46,"tag":92,"props":543,"children":544},{},[545],{"type":51,"value":306},{"type":46,"tag":92,"props":547,"children":548},{},[549],{"type":51,"value":550},"Slot name",{"type":46,"tag":92,"props":552,"children":553},{},[554],{"type":51,"value":555},"Slot kind",{"type":46,"tag":92,"props":557,"children":558},{},[559],{"type":51,"value":560},"Available asset",{"type":46,"tag":92,"props":562,"children":563},{},[564],{"type":51,"value":565},"Status",{"type":46,"tag":108,"props":567,"children":568},{},[569,596,622],{"type":46,"tag":88,"props":570,"children":571},{},[572,576,581,586,591],{"type":46,"tag":115,"props":573,"children":574},{},[575],{"type":51,"value":341},{"type":46,"tag":115,"props":577,"children":578},{},[579],{"type":51,"value":580},"Hero_Image",{"type":46,"tag":115,"props":582,"children":583},{},[584],{"type":51,"value":585},"image",{"type":46,"tag":115,"props":587,"children":588},{},[589],{"type":51,"value":590},"bloom_summer.jpg → asset_id pending",{"type":46,"tag":115,"props":592,"children":593},{},[594],{"type":51,"value":595},"upload",{"type":46,"tag":88,"props":597,"children":598},{},[599,603,608,612,617],{"type":46,"tag":115,"props":600,"children":601},{},[602],{"type":51,"value":341},{"type":46,"tag":115,"props":604,"children":605},{},[606],{"type":51,"value":607},"Headline",{"type":46,"tag":115,"props":609,"children":610},{},[611],{"type":51,"value":51},{"type":46,"tag":115,"props":613,"children":614},{},[615],{"type":51,"value":616},"\"Summer linen, finally\"",{"type":46,"tag":115,"props":618,"children":619},{},[620],{"type":51,"value":621},"ready",{"type":46,"tag":88,"props":623,"children":624},{},[625,630,634,638,643],{"type":46,"tag":115,"props":626,"children":627},{},[628],{"type":51,"value":629},"Jun 9",{"type":46,"tag":115,"props":631,"children":632},{},[633],{"type":51,"value":466},{"type":46,"tag":115,"props":635,"children":636},{},[637],{"type":51,"value":585},{"type":46,"tag":115,"props":639,"children":640},{},[641],{"type":51,"value":642},"—",{"type":46,"tag":115,"props":644,"children":645},{},[646],{"type":46,"tag":152,"props":647,"children":648},{},[649],{"type":51,"value":650},"MISSING",{"type":46,"tag":187,"props":652,"children":653},{},[654,659,661,670,673],{"type":46,"tag":152,"props":655,"children":656},{},[657],{"type":51,"value":658},"Resolve slot\u002Fasset mismatches with the owner.",{"type":51,"value":660}," If the template has\nmore image slots than the brief provides photos, pause and ask:",{"type":46,"tag":67,"props":662,"children":665},{"className":663,"code":664,"language":51},[70],"The \"Summer Carousel\" template has 5 image slots. The brief gave me 1\nphoto (bloom_summer.jpg). How should I fill the other 4?\n\n  1. Reuse the same photo across all 5 slots\n  2. You send me 4 more photos (file paths)\n  3. Pick a simpler template with fewer slots\n",[666],{"type":46,"tag":74,"props":667,"children":668},{"__ignoreMap":76},[669],{"type":51,"value":664},{"type":46,"tag":255,"props":671,"children":672},{},[],{"type":51,"value":674},"No generation calls until the owner picks. Generating with empty slots\nproduces designs full of Canva's default landscape placeholders.",{"type":46,"tag":187,"props":676,"children":677},{},[678,683,685,691,693,699,701,707,709,715],{"type":46,"tag":152,"props":679,"children":680},{},[681],{"type":51,"value":682},"Upload missing photos and capture verified asset IDs.",{"type":51,"value":684}," Upload via\n",{"type":46,"tag":74,"props":686,"children":688},{"className":687},[],[689],{"type":51,"value":690},"POST \u002Fv1\u002Fasset-uploads",{"type":51,"value":692},", then poll ",{"type":46,"tag":74,"props":694,"children":696},{"className":695},[],[697],{"type":51,"value":698},"GET \u002Fv1\u002Fasset-uploads\u002F{job_id}",{"type":51,"value":700},"\nuntil ",{"type":46,"tag":74,"props":702,"children":704},{"className":703},[],[705],{"type":51,"value":706},"status == \"success\"",{"type":51,"value":708},". Record ",{"type":46,"tag":74,"props":710,"children":712},{"className":711},[],[713],{"type":51,"value":714},"asset.id",{"type":51,"value":716}," from the response — this\nis the only value that works in an autofill image field. Passing an\nempty string, a URL, a file path, or a stale ID silently renders\nCanva's stock landscape graphic instead of the photo.",{"type":46,"tag":187,"props":718,"children":719},{},[720,725,727,732],{"type":46,"tag":152,"props":721,"children":722},{},[723],{"type":51,"value":724},"Confirm the manifest.",{"type":51,"value":726}," Show the owner the completed slot-by-slot\ntable with every slot resolved and every image ",{"type":46,"tag":74,"props":728,"children":730},{"className":729},[],[731],{"type":51,"value":714},{"type":51,"value":733}," confirmed.\nThis is the last stop before Canva API calls.",{"type":46,"tag":168,"props":735,"children":736},{},[],{"type":46,"tag":270,"props":738,"children":740},{"id":739},"stage-3-canva-design-generation",[741],{"type":51,"value":742},"Stage 3 — Canva design generation",{"type":46,"tag":61,"props":744,"children":745},{},[746,748,753,755,760],{"type":51,"value":747},"Before any Canva API call, re-read the calendar and drop any row whose\n",{"type":46,"tag":74,"props":749,"children":751},{"className":750},[],[752],{"type":51,"value":96},{"type":51,"value":754}," is not ",{"type":46,"tag":74,"props":756,"children":758},{"className":757},[],[759],{"type":51,"value":119},{"type":51,"value":761},". Email rows do not pass through this\nstage.",{"type":46,"tag":61,"props":763,"children":764},{},[765,767,772],{"type":51,"value":766},"Generate designs ",{"type":46,"tag":152,"props":768,"children":769},{},[770],{"type":51,"value":771},"one calendar row at a time",{"type":51,"value":773},", with 3 candidates per row\n(or the value chosen at pre-flight). Each row follows the same loop:\ngenerate candidates → verify → export → visually check → retry failures\n→ present → wait for owner pick → next row. Pause 30 seconds between\nrows. This caps the burst at 3 generations + 3 exports per ~30s — well\nunder Canva's 100 req\u002Fmin rate limit. Do not parallelize multiple rows;\none row at a time is the protection that keeps the owner from hitting\nquota mid-campaign.",{"type":46,"tag":61,"props":775,"children":776},{},[777,782],{"type":46,"tag":152,"props":778,"children":779},{},[780],{"type":51,"value":781},"Polling cadence.",{"type":51,"value":783}," Poll job status every 3-5 seconds, not faster.\nTighter intervals burn quota without speeding up completion.",{"type":46,"tag":61,"props":785,"children":786},{},[787,792,794,800,802,808,810,816],{"type":46,"tag":152,"props":788,"children":789},{},[790],{"type":51,"value":791},"Preview URLs — only one type is safe to embed.",{"type":51,"value":793}," Autofill responses\nreturn ",{"type":46,"tag":74,"props":795,"children":797},{"className":796},[],[798],{"type":51,"value":799},"design.canva.ai",{"type":51,"value":801}," thumbnails that expire within minutes; embedding\nthem as markdown images produces broken \"Show Image\" placeholders.\nPermanent export URLs (",{"type":46,"tag":74,"props":803,"children":805},{"className":804},[],[806],{"type":51,"value":807},"export-download.canva.com",{"type":51,"value":809}," or the ",{"type":46,"tag":74,"props":811,"children":813},{"className":812},[],[814],{"type":51,"value":815},"export-design",{"type":51,"value":817},"\nMCP tool) do not expire. Native Cowork carousels render the autofill\nresult directly using the connector's authenticated session — let them\nrender on their own, don't re-embed.",{"type":46,"tag":819,"props":820,"children":822},"h4",{"id":821},"row-loop",[823],{"type":51,"value":824},"Row loop",{"type":46,"tag":183,"props":826,"children":827},{},[828,867,904,1009,1076,1121,1140,1179],{"type":46,"tag":187,"props":829,"children":830},{},[831,836,838],{"type":46,"tag":152,"props":832,"children":833},{},[834],{"type":51,"value":835},"Resolve template.",{"type":51,"value":837}," (Once per session — same template across rows\nunless the calendar mixes asset types.)",{"type":46,"tag":477,"props":839,"children":840},{},[841,854],{"type":46,"tag":187,"props":842,"children":843},{},[844,846,852],{"type":51,"value":845},"Enterprise: ",{"type":46,"tag":74,"props":847,"children":849},{"className":848},[],[850],{"type":51,"value":851},"GET \u002Fv1\u002Fbrand-templates",{"type":51,"value":853}," filtered by asset type.",{"type":46,"tag":187,"props":855,"children":856},{},[857,859,865],{"type":51,"value":858},"Pro\u002FTeams: ",{"type":46,"tag":74,"props":860,"children":862},{"className":861},[],[863],{"type":51,"value":864},"GET \u002Fv1\u002Fdesigns?ownership=any&query={template name}",{"type":51,"value":866},",\nsurface top 3 to the owner, confirm one before generating.",{"type":46,"tag":187,"props":868,"children":869},{},[870,875,877],{"type":46,"tag":152,"props":871,"children":872},{},[873],{"type":51,"value":874},"Generate the row's candidates in parallel.",{"type":51,"value":876}," Fire the row's 3\ncandidates simultaneously (or N from pre-flight).",{"type":46,"tag":477,"props":878,"children":879},{},[880,892],{"type":46,"tag":187,"props":881,"children":882},{},[883,884,890],{"type":51,"value":845},{"type":46,"tag":74,"props":885,"children":887},{"className":886},[],[888],{"type":51,"value":889},"POST \u002Fv1\u002Fautofills",{"type":51,"value":891}," per candidate with the template ID\nand field values. Poll all jobs concurrently.",{"type":46,"tag":187,"props":893,"children":894},{},[895,896,902],{"type":51,"value":858},{"type":46,"tag":74,"props":897,"children":899},{"className":898},[],[900],{"type":51,"value":901},"POST \u002Fv1\u002Fdesigns",{"type":51,"value":903}," to create copies. Describe the text and\nimage edits the owner applies in Canva; collect design IDs back.",{"type":46,"tag":187,"props":905,"children":906},{},[907,912,914,920,922,927,929,935,937],{"type":46,"tag":152,"props":908,"children":909},{},[910],{"type":51,"value":911},"Verify job status.",{"type":51,"value":913}," For each candidate, confirm\n",{"type":46,"tag":74,"props":915,"children":917},{"className":916},[],[918],{"type":51,"value":919},"GET \u002Fautofills\u002F{job_id}",{"type":51,"value":921}," returned ",{"type":46,"tag":74,"props":923,"children":925},{"className":924},[],[926],{"type":51,"value":706},{"type":51,"value":928}," and\n",{"type":46,"tag":74,"props":930,"children":932},{"className":931},[],[933],{"type":51,"value":934},"result.design.id",{"type":51,"value":936}," is present. Handle errors per-design:",{"type":46,"tag":477,"props":938,"children":939},{},[940,959,970],{"type":46,"tag":187,"props":941,"children":942},{},[943,949,951,957],{"type":46,"tag":74,"props":944,"children":946},{"className":945},[],[947],{"type":51,"value":948},"JOB_FAILED",{"type":51,"value":950}," → read ",{"type":46,"tag":74,"props":952,"children":954},{"className":953},[],[955],{"type":51,"value":956},"job.error.message",{"type":51,"value":958},", fix the field values or\nasset IDs, retry once.",{"type":46,"tag":187,"props":960,"children":961},{},[962,968],{"type":46,"tag":74,"props":963,"children":965},{"className":964},[],[966],{"type":51,"value":967},"RATE_LIMIT_EXCEEDED",{"type":51,"value":969}," (first hit this session) → wait 60s, retry\nthat one candidate once. This handles transient spikes.",{"type":46,"tag":187,"props":971,"children":972},{},[973,978,980,985,987,993,995,1004,1007],{"type":46,"tag":74,"props":974,"children":976},{"className":975},[],[977],{"type":51,"value":967},{"type":51,"value":979}," (second hit this session) ",{"type":46,"tag":152,"props":981,"children":982},{},[983],{"type":51,"value":984},"or",{"type":51,"value":986}," any\n",{"type":46,"tag":74,"props":988,"children":990},{"className":989},[],[991],{"type":51,"value":992},"quota_exceeded",{"type":51,"value":994}," \u002F daily-cap error → stop generation immediately.\nDo not retry. Surface progress and ask:",{"type":46,"tag":67,"props":996,"children":999},{"className":997,"code":998,"language":51},[70],"Canva is rate-limiting the campaign. Status so far:\n  ✓ Generated:  Posts 1-4 (12 designs)\n  ⏸ Remaining:  Posts 5-8 (12 designs not yet generated)\n\nHow should I proceed?\n  1. Switch to 1 candidate per remaining row (4 designs total) — finishes now\n  2. Pause campaign — resume in 60 minutes when quota refills\n  3. Stop generation — work with what we have, move to captions\n",[1000],{"type":46,"tag":74,"props":1001,"children":1002},{"__ignoreMap":76},[1003],{"type":51,"value":998},{"type":46,"tag":255,"props":1005,"children":1006},{},[],{"type":51,"value":1008},"Wait for the owner's choice. Do not loop on retry.",{"type":46,"tag":187,"props":1010,"children":1011},{},[1012,1017,1019,1071,1074],{"type":46,"tag":152,"props":1013,"children":1014},{},[1015],{"type":51,"value":1016},"Export each successful candidate to a permanent PNG.",{"type":51,"value":1018}," Fire the\nrow's exports in parallel.",{"type":46,"tag":477,"props":1020,"children":1021},{},[1022,1059],{"type":46,"tag":187,"props":1023,"children":1024},{},[1025,1027,1033,1035,1041,1043,1049,1051,1057],{"type":51,"value":1026},"REST: ",{"type":46,"tag":74,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":51,"value":1032},"POST \u002Fv1\u002Fexports",{"type":51,"value":1034}," with ",{"type":46,"tag":74,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":51,"value":1040},"format.type: \"png\"",{"type":51,"value":1042},", poll\n",{"type":46,"tag":74,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":51,"value":1048},"GET \u002Fv1\u002Fexports\u002F{job_id}",{"type":51,"value":1050}," until success, capture ",{"type":46,"tag":74,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":51,"value":1056},"urls[0]",{"type":51,"value":1058},".",{"type":46,"tag":187,"props":1060,"children":1061},{},[1062,1064,1069],{"type":51,"value":1063},"Canva MCP: ",{"type":46,"tag":74,"props":1065,"children":1067},{"className":1066},[],[1068],{"type":51,"value":815},{"type":51,"value":1070}," with the design ID.",{"type":46,"tag":255,"props":1072,"children":1073},{},[],{"type":51,"value":1075},"These permanent URLs are what get embedded in previews and attached to\nthe HubSpot post later. The autofill response thumbnail is never used\ndownstream.",{"type":46,"tag":187,"props":1077,"children":1078},{},[1079,1084,1086,1109,1112,1114,1119],{"type":46,"tag":152,"props":1080,"children":1081},{},[1082],{"type":51,"value":1083},"Visually verify each export.",{"type":51,"value":1085}," Look at the image and reject any of\nthese — they all indicate an unfilled slot or wrong asset:",{"type":46,"tag":477,"props":1087,"children":1088},{},[1089,1094,1099,1104],{"type":46,"tag":187,"props":1090,"children":1091},{},[1092],{"type":51,"value":1093},"Generic landscape with clouds and green hills (Canva's default\nplaceholder)",{"type":46,"tag":187,"props":1095,"children":1096},{},[1097],{"type":51,"value":1098},"Solid gray rectangles where a photo should be",{"type":46,"tag":187,"props":1100,"children":1101},{},[1102],{"type":51,"value":1103},"Lorem-ipsum or template-default text",{"type":46,"tag":187,"props":1105,"children":1106},{},[1107],{"type":51,"value":1108},"Subject that doesn't match the brief (wrong product, wrong brand)",{"type":46,"tag":255,"props":1110,"children":1111},{},[],{"type":51,"value":1113},"If a candidate fails verification: re-check the manifest for the\naffected slot, fix the ",{"type":46,"tag":74,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":51,"value":714},{"type":51,"value":1120},", regenerate that single candidate,\nre-export, re-verify.",{"type":46,"tag":187,"props":1122,"children":1123},{},[1124,1129,1131],{"type":46,"tag":152,"props":1125,"children":1126},{},[1127],{"type":51,"value":1128},"Retry per-candidate on partial failure.",{"type":51,"value":1130}," If 1 of N candidates in\nthe row failed at Step 3 or 5, regenerate just that one — don't redo\nthe whole row and don't present a partial broken carousel. If the\nsecond attempt also fails:",{"type":46,"tag":67,"props":1132,"children":1135},{"className":1133,"code":1134,"language":51},[70],"The third candidate for the Jun 9 post keeps failing — Canva returned\n[error \u002F rendered placeholder]. How should I proceed?\n\n  1. Skip it — present the other 2 and move on\n  2. Swap to a simpler template for just this candidate\n  3. Try once more with a different photo\n",[1136],{"type":46,"tag":74,"props":1137,"children":1138},{"__ignoreMap":76},[1139],{"type":51,"value":1134},{"type":46,"tag":187,"props":1141,"children":1142},{},[1143,1148,1150,1159,1162,1164,1170,1172,1177],{"type":46,"tag":152,"props":1144,"children":1145},{},[1146],{"type":51,"value":1147},"Present the row's candidates.",{"type":51,"value":1149}," Let the native Cowork carousel\nrender the autofill tool result. Below it, add a text prompt:",{"type":46,"tag":67,"props":1151,"children":1154},{"className":1152,"code":1153,"language":51},[70],"Jun 9 candidates are ready — scroll through the carousel above.\nWhich one should I use for the Jun 9 post?\n",[1155],{"type":46,"tag":74,"props":1156,"children":1157},{"__ignoreMap":76},[1158],{"type":51,"value":1153},{"type":46,"tag":255,"props":1160,"children":1161},{},[],{"type":51,"value":1163},"If the carousel doesn't render or one position is broken, embed the\npermanent export PNG URLs from Step 4 instead. Final fallback: link to\nthe design's Canva edit URL (",{"type":46,"tag":74,"props":1165,"children":1167},{"className":1166},[],[1168],{"type":51,"value":1169},"https:\u002F\u002Fwww.canva.com\u002Fd\u002F{design_id}",{"type":51,"value":1171},").\nNever re-embed ",{"type":46,"tag":74,"props":1173,"children":1175},{"className":1174},[],[1176],{"type":51,"value":799},{"type":51,"value":1178}," URLs.",{"type":46,"tag":187,"props":1180,"children":1181},{},[1182],{"type":46,"tag":152,"props":1183,"children":1184},{},[1185],{"type":51,"value":1186},"Pause 30 seconds, then move to the next row.",{"type":46,"tag":61,"props":1188,"children":1189},{},[1190,1195],{"type":46,"tag":152,"props":1191,"children":1192},{},[1193],{"type":51,"value":1194},"Checkpoint 2.",{"type":51,"value":1196}," Satisfied once the owner has picked one design per\ncalendar row. If they want a regenerate, regenerate only that one\ncandidate.",{"type":46,"tag":168,"props":1198,"children":1199},{},[],{"type":46,"tag":270,"props":1201,"children":1203},{"id":1202},"stage-4-copy-drafting",[1204],{"type":51,"value":1205},"Stage 4 — Copy drafting",{"type":46,"tag":61,"props":1207,"children":1208},{},[1209],{"type":51,"value":1210},"For each calendar row, draft the copy. Social rows get a caption; email\nrows get a full email.",{"type":46,"tag":61,"props":1212,"children":1213},{},[1214,1219],{"type":46,"tag":152,"props":1215,"children":1216},{},[1217],{"type":51,"value":1218},"Social captions",{"type":51,"value":1220}," — Instagram, Facebook, X, LinkedIn:",{"type":46,"tag":477,"props":1222,"children":1223},{},[1224,1229,1234,1239],{"type":46,"tag":187,"props":1225,"children":1226},{},[1227],{"type":51,"value":1228},"Length: channel-appropriate (Instagram ≤ 2,200 chars; Facebook ≤ 500\nrecommended; X ≤ 280).",{"type":46,"tag":187,"props":1230,"children":1231},{},[1232],{"type":51,"value":1233},"Structure: hook → one product benefit → CTA → 3-5 hashtags (not 30).",{"type":46,"tag":187,"props":1235,"children":1236},{},[1237],{"type":51,"value":1238},"Voice: match the brief's tone markers. If the brief says \"casual and\nfriendly,\" don't write corporate copy.",{"type":46,"tag":187,"props":1240,"children":1241},{},[1242],{"type":51,"value":1243},"No filler. No \"Exciting news!\" or \"We're thrilled to announce.\" Open\nwith the value.",{"type":46,"tag":61,"props":1245,"children":1246},{},[1247,1252],{"type":46,"tag":152,"props":1248,"children":1249},{},[1250],{"type":51,"value":1251},"Email content",{"type":51,"value":1253}," — Claude writes the entire email; no Canva:",{"type":46,"tag":477,"props":1255,"children":1256},{},[1257,1262,1267,1272,1277,1282],{"type":46,"tag":187,"props":1258,"children":1259},{},[1260],{"type":51,"value":1261},"Subject: ≤ 50 chars, specific, no clickbait. \"Spring projects are\nbooking up\" beats \"Don't miss out!\"",{"type":46,"tag":187,"props":1263,"children":1264},{},[1265],{"type":51,"value":1266},"Preheader: ≤ 90 chars, complements the subject without repeating it.",{"type":46,"tag":187,"props":1268,"children":1269},{},[1270],{"type":51,"value":1271},"Body: plain prose, 100-250 words. Opening line that earns the read →\n1-2 paragraphs of substance → single clear CTA → sign-off.",{"type":46,"tag":187,"props":1273,"children":1274},{},[1275],{"type":51,"value":1276},"Voice: same tone markers as social. Owners want their emails to sound\nlike them, not like a templated newsletter.",{"type":46,"tag":187,"props":1278,"children":1279},{},[1280],{"type":51,"value":1281},"No image references. Don't write \"see image above.\" If the owner wants\nvisuals, they add them in their email tool.",{"type":46,"tag":187,"props":1283,"children":1284},{},[1285],{"type":51,"value":1286},"One CTA per email. Pick the most important action and lead with it.",{"type":46,"tag":61,"props":1288,"children":1289},{},[1290],{"type":51,"value":1291},"Present captions inline below each social row. Present full emails\ninline below each email row:",{"type":46,"tag":67,"props":1293,"children":1296},{"className":1294,"code":1295,"language":51},[70],"Subject: \u003Csubject line>\nPreheader: \u003Cpreheader text>\n\n\u003Cbody text>\n",[1297],{"type":46,"tag":74,"props":1298,"children":1299},{"__ignoreMap":76},[1300],{"type":51,"value":1295},{"type":46,"tag":61,"props":1302,"children":1303},{},[1304,1306,1311],{"type":51,"value":1305},"For worked examples, see\n",{"type":46,"tag":218,"props":1307,"children":1309},{"href":1308},"reference\u002Fexamples\u002Fboutique-brief-campaign.md",[1310],{"type":51,"value":1308},{"type":51,"value":1058},{"type":46,"tag":61,"props":1313,"children":1314},{},[1315,1320],{"type":46,"tag":152,"props":1316,"children":1317},{},[1318],{"type":51,"value":1319},"Checkpoint 3.",{"type":51,"value":1321}," \"Any captions or emails to rewrite? Flag the date and\nwhat to change.\" Iterate until approved.",{"type":46,"tag":168,"props":1323,"children":1324},{},[],{"type":46,"tag":270,"props":1326,"children":1328},{"id":1327},"stage-5-hubspot-staging-email-handoff",[1329],{"type":51,"value":1330},"Stage 5 — HubSpot staging + email handoff",{"type":46,"tag":61,"props":1332,"children":1333},{},[1334,1336,1340],{"type":51,"value":1335},"Stage social posts in HubSpot. Email content is not staged — it's\nsurfaced inline for the owner to copy into their email tool. For API\nfield reference, see\n",{"type":46,"tag":218,"props":1337,"children":1338},{"href":220},[1339],{"type":51,"value":220},{"type":51,"value":1058},{"type":46,"tag":183,"props":1342,"children":1343},{},[1344,1362,1460,1478],{"type":46,"tag":187,"props":1345,"children":1346},{},[1347,1352,1354,1360],{"type":46,"tag":152,"props":1348,"children":1349},{},[1350],{"type":51,"value":1351},"Create the campaign.",{"type":51,"value":1353}," ",{"type":46,"tag":74,"props":1355,"children":1357},{"className":1356},[],[1358],{"type":51,"value":1359},"POST \u002Fmarketing\u002Fv3\u002Fcampaigns",{"type":51,"value":1361}," with the\ncampaign name and start\u002Fend dates from the calendar.",{"type":46,"tag":187,"props":1363,"children":1364},{},[1365,1370,1371,1377,1379,1384,1386],{"type":46,"tag":152,"props":1366,"children":1367},{},[1368],{"type":51,"value":1369},"Stage each social post.",{"type":51,"value":1353},{"type":46,"tag":74,"props":1372,"children":1374},{"className":1373},[],[1375],{"type":51,"value":1376},"POST",{"type":51,"value":1378}," to the HubSpot Social API per\n",{"type":46,"tag":74,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":51,"value":119},{"type":51,"value":1385}," row:",{"type":46,"tag":477,"props":1387,"children":1388},{},[1389,1400,1411,1422,1433],{"type":46,"tag":187,"props":1390,"children":1391},{},[1392,1398],{"type":46,"tag":74,"props":1393,"children":1395},{"className":1394},[],[1396],{"type":51,"value":1397},"channel",{"type":51,"value":1399},": map calendar channel to HubSpot account ID",{"type":46,"tag":187,"props":1401,"children":1402},{},[1403,1409],{"type":46,"tag":74,"props":1404,"children":1406},{"className":1405},[],[1407],{"type":51,"value":1408},"scheduledAt",{"type":51,"value":1410},": ISO 8601 datetime — confirm it's in the future before\ncalling",{"type":46,"tag":187,"props":1412,"children":1413},{},[1414,1420],{"type":46,"tag":74,"props":1415,"children":1417},{"className":1416},[],[1418],{"type":51,"value":1419},"content.body",{"type":51,"value":1421},": approved caption",{"type":46,"tag":187,"props":1423,"children":1424},{},[1425,1431],{"type":46,"tag":74,"props":1426,"children":1428},{"className":1427},[],[1429],{"type":51,"value":1430},"attachments",{"type":51,"value":1432},": permanent Canva export PNG URL from Stage 3",{"type":46,"tag":187,"props":1434,"children":1435},{},[1436,1442,1444,1450,1452,1458],{"type":46,"tag":74,"props":1437,"children":1439},{"className":1438},[],[1440],{"type":51,"value":1441},"status",{"type":51,"value":1443},": ",{"type":46,"tag":74,"props":1445,"children":1447},{"className":1446},[],[1448],{"type":51,"value":1449},"SCHEDULED",{"type":51,"value":1451}," (never ",{"type":46,"tag":74,"props":1453,"children":1455},{"className":1454},[],[1456],{"type":51,"value":1457},"PUBLISHED",{"type":51,"value":1459},")",{"type":46,"tag":187,"props":1461,"children":1462},{},[1463,1468,1470,1476],{"type":46,"tag":152,"props":1464,"children":1465},{},[1466],{"type":51,"value":1467},"Confirm the queue.",{"type":51,"value":1469}," Call\n",{"type":46,"tag":74,"props":1471,"children":1473},{"className":1472},[],[1474],{"type":51,"value":1475},"GET \u002Fmarketing\u002Fv3\u002Fsocial\u002Fposts?status=SCHEDULED",{"type":51,"value":1477},", surface the list,\nprovide a direct link to the HubSpot campaign view.",{"type":46,"tag":187,"props":1479,"children":1480},{},[1481,1486],{"type":46,"tag":152,"props":1482,"children":1483},{},[1484],{"type":51,"value":1485},"Surface email content for handoff.",{"type":51,"value":1487}," For each email row, present the\napproved subject + preheader + body inline, grouped by send date. The\nowner copies these into their email tool (HubSpot Marketing Email,\nMailchimp, Gmail).",{"type":46,"tag":61,"props":1489,"children":1490},{},[1491],{"type":46,"tag":152,"props":1492,"children":1493},{},[1494],{"type":51,"value":1495},"Final checkpoint.",{"type":46,"tag":67,"props":1497,"children":1500},{"className":1498,"code":1499,"language":51},[70],"Your social posts are scheduled in HubSpot: [link]\nThey'll go out as scheduled — you can cancel or edit any post in HubSpot.\n\nEmail content is drafted below — copy each into your email tool when\nyou're ready to send:\n\n  Jun 5 — \"Spring projects are booking up\"\n  Jul 15 — \"Summer maintenance windows are filling\"\n\nAnything to change before we're done?\n",[1501],{"type":46,"tag":74,"props":1502,"children":1503},{"__ignoreMap":76},[1504],{"type":51,"value":1499},{"type":46,"tag":168,"props":1506,"children":1507},{},[],{"type":46,"tag":54,"props":1509,"children":1511},{"id":1510},"approval-gates",[1512],{"type":51,"value":1513},"Approval gates",{"type":46,"tag":477,"props":1515,"children":1516},{},[1517,1534,1551,1561,1571,1581,1591,1608,1618,1628,1638],{"type":46,"tag":187,"props":1518,"children":1519},{},[1520,1525,1527,1532],{"type":46,"tag":152,"props":1521,"children":1522},{},[1523],{"type":51,"value":1524},"No Canva calls for email rows.",{"type":51,"value":1526}," Re-check the ",{"type":46,"tag":74,"props":1528,"children":1530},{"className":1529},[],[1531],{"type":51,"value":96},{"type":51,"value":1533}," column before\nevery API call.",{"type":46,"tag":187,"props":1535,"children":1536},{},[1537,1542,1544,1549],{"type":46,"tag":152,"props":1538,"children":1539},{},[1540],{"type":51,"value":1541},"No publishing.",{"type":51,"value":1543}," Every HubSpot post is staged as ",{"type":46,"tag":74,"props":1545,"children":1547},{"className":1546},[],[1548],{"type":51,"value":1449},{"type":51,"value":1550},"; the\nowner controls go-live.",{"type":46,"tag":187,"props":1552,"children":1553},{},[1554,1559],{"type":46,"tag":152,"props":1555,"children":1556},{},[1557],{"type":51,"value":1558},"Always surface the generation budget at pre-flight.",{"type":51,"value":1560}," Owner sees the\ntotal design count and approves before Stage 1 begins.",{"type":46,"tag":187,"props":1562,"children":1563},{},[1564,1569],{"type":46,"tag":152,"props":1565,"children":1566},{},[1567],{"type":51,"value":1568},"One row at a time in Stage 3.",{"type":51,"value":1570}," Candidates within a row fire in\nparallel, but rows are sequential with a 30s gap — this is the quota\nprotection.",{"type":46,"tag":187,"props":1572,"children":1573},{},[1574,1579],{"type":46,"tag":152,"props":1575,"children":1576},{},[1577],{"type":51,"value":1578},"On the second quota error, pause and ask.",{"type":51,"value":1580}," Never loop on retry.",{"type":46,"tag":187,"props":1582,"children":1583},{},[1584,1589],{"type":46,"tag":152,"props":1585,"children":1586},{},[1587],{"type":51,"value":1588},"Always export to a permanent PNG before presenting.",{"type":51,"value":1590}," Job success\ndoesn't mean the design rendered correctly.",{"type":46,"tag":187,"props":1592,"children":1593},{},[1594,1606],{"type":46,"tag":152,"props":1595,"children":1596},{},[1597,1599,1604],{"type":51,"value":1598},"Never embed ",{"type":46,"tag":74,"props":1600,"children":1602},{"className":1601},[],[1603],{"type":51,"value":799},{"type":51,"value":1605}," URLs in messages.",{"type":51,"value":1607}," They expire.",{"type":46,"tag":187,"props":1609,"children":1610},{},[1611,1616],{"type":46,"tag":152,"props":1612,"children":1613},{},[1614],{"type":51,"value":1615},"Never regenerate the whole row when one candidate fails.",{"type":51,"value":1617},"\nPer-candidate retry only.",{"type":46,"tag":187,"props":1619,"children":1620},{},[1621,1626],{"type":46,"tag":152,"props":1622,"children":1623},{},[1624],{"type":51,"value":1625},"Never auto-select a template for Pro\u002FTeams users.",{"type":51,"value":1627}," Always confirm.",{"type":46,"tag":187,"props":1629,"children":1630},{},[1631,1636],{"type":46,"tag":152,"props":1632,"children":1633},{},[1634],{"type":51,"value":1635},"Never skip slot-by-slot inventory.",{"type":51,"value":1637}," Multi-slot templates render\nplaceholder landscapes when any slot is empty.",{"type":46,"tag":187,"props":1639,"children":1640},{},[1641,1646],{"type":46,"tag":152,"props":1642,"children":1643},{},[1644],{"type":51,"value":1645},"Never skip Checkpoint 1.",{"type":51,"value":1647}," Generating before the calendar is approved\nis the largest source of wasted work in this skill.",{"type":46,"tag":168,"props":1649,"children":1650},{},[],{"type":46,"tag":54,"props":1652,"children":1654},{"id":1653},"reference",[1655],{"type":51,"value":1656},"Reference",{"type":46,"tag":477,"props":1658,"children":1659},{},[1660,1670,1679,1688],{"type":46,"tag":187,"props":1661,"children":1662},{},[1663,1668],{"type":46,"tag":218,"props":1664,"children":1666},{"href":1665},"reference\u002Fcanva-api.md",[1667],{"type":51,"value":1665},{"type":51,"value":1669}," — Canva Connect API\nendpoints, asset upload, export formats, MCP equivalents",{"type":46,"tag":187,"props":1671,"children":1672},{},[1673,1677],{"type":46,"tag":218,"props":1674,"children":1675},{"href":220},[1676],{"type":51,"value":220},{"type":51,"value":1678}," — HubSpot\nSocial API and CSV fallback for non-Pro tiers",{"type":46,"tag":187,"props":1680,"children":1681},{},[1682,1686],{"type":46,"tag":218,"props":1683,"children":1684},{"href":164},[1685],{"type":51,"value":164},{"type":51,"value":1687}," — Good \u002F Bad patterns for\nevery failure mode this skill has hit in production",{"type":46,"tag":187,"props":1689,"children":1690},{},[1691,1695],{"type":46,"tag":218,"props":1692,"children":1693},{"href":1308},[1694],{"type":51,"value":1308},{"type":51,"value":1696},"\n— full worked examples (single-slot social, multi-slot template)",{"items":1698,"total":1811},[1699,1715,1731,1747,1765,1784,1798],{"slug":1700,"name":1700,"fn":1701,"description":1702,"org":1703,"tags":1704,"stars":29,"repoUrl":30,"updatedAt":1714},"accessibility-review","run WCAG accessibility audits","Run a WCAG 2.1 AA accessibility audit on a design or page. Trigger with \"audit accessibility\", \"check a11y\", \"is this accessible?\", or when reviewing a design for color contrast, keyboard navigation, touch target size, or screen reader behavior before handoff.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1705,1708,1711],{"name":1706,"slug":1707,"type":16},"Accessibility","accessibility",{"name":1709,"slug":1710,"type":16},"Design","design",{"name":1712,"slug":1713,"type":16},"WCAG","wcag","2026-04-06T17:58:05.682394",{"slug":1716,"name":1716,"fn":1717,"description":1718,"org":1719,"tags":1720,"stars":29,"repoUrl":30,"updatedAt":1730},"account-research","research accounts for sales intel","Research a company or person and get actionable sales intel. Works standalone with web search, supercharged when you connect enrichment tools or your CRM. Trigger with \"research [company]\", \"look up [person]\", \"intel on [prospect]\", \"who is [name] at [company]\", or \"tell me about [company]\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1721,1724,1727],{"name":1722,"slug":1723,"type":16},"CRM","crm",{"name":1725,"slug":1726,"type":16},"Research","research",{"name":1728,"slug":1729,"type":16},"Sales","sales","2026-04-06T17:56:41.410418",{"slug":1732,"name":1732,"fn":1733,"description":1734,"org":1735,"tags":1736,"stars":29,"repoUrl":30,"updatedAt":1746},"analyze","answer data questions and run analyses","Answer data questions -- from quick lookups to full analyses. Use when looking up a single metric, investigating what's driving a trend or drop, comparing segments over time, or preparing a formal data report for stakeholders.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1737,1740,1743],{"name":1738,"slug":1739,"type":16},"Analytics","analytics",{"name":1741,"slug":1742,"type":16},"Data Analysis","data-analysis",{"name":1744,"slug":1745,"type":16},"SQL","sql","2026-04-06T17:57:21.593647",{"slug":1748,"name":1748,"fn":1749,"description":1750,"org":1751,"tags":1752,"stars":29,"repoUrl":30,"updatedAt":1764},"architecture","create and evaluate architecture decision records","Create or evaluate an architecture decision record (ADR). Use when choosing between technologies (e.g., Kafka vs SQS), documenting a design decision with trade-offs and consequences, reviewing a system design proposal, or designing a new component from requirements and constraints.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1753,1756,1758,1761],{"name":1754,"slug":1755,"type":16},"ADR","adr",{"name":1757,"slug":1748,"type":16},"Architecture",{"name":1759,"slug":1760,"type":16},"Documentation","documentation",{"name":1762,"slug":1763,"type":16},"Engineering","engineering","2026-04-06T17:57:49.26444",{"slug":1766,"name":1766,"fn":1767,"description":1768,"org":1769,"tags":1770,"stars":29,"repoUrl":30,"updatedAt":1783},"audit-support","support SOX 404 control testing","Support SOX 404 compliance with control testing methodology, sample selection, and documentation standards. Use when generating testing workpapers, selecting audit samples, classifying control deficiencies, or preparing for internal or external audits.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1771,1774,1777,1780],{"name":1772,"slug":1773,"type":16},"Audit","audit",{"name":1775,"slug":1776,"type":16},"Finance","finance",{"name":1778,"slug":1779,"type":16},"Regulatory Compliance","regulatory-compliance",{"name":1781,"slug":1782,"type":16},"SOX","sox","2026-04-06T17:57:36.714815",{"slug":1785,"name":1785,"fn":1786,"description":1787,"org":1788,"tags":1789,"stars":29,"repoUrl":30,"updatedAt":1797},"brand-review","review content against brand voice","Review content against your brand voice, style guide, and messaging pillars, flagging deviations by severity with specific before\u002Fafter fixes. Use when checking a draft before it ships, when auditing copy for voice consistency and terminology, or when screening for unsubstantiated claims, missing disclaimers, and other legal flags.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1790,1793,1794],{"name":1791,"slug":1792,"type":16},"Branding","branding",{"name":18,"slug":19,"type":16},{"name":1795,"slug":1796,"type":16},"Writing","writing","2026-04-06T17:58:19.548331",{"slug":1799,"name":1799,"fn":1800,"description":1801,"org":1802,"tags":1803,"stars":29,"repoUrl":30,"updatedAt":1810},"brand-voice-enforcement","enforce brand voice in content","This skill applies brand guidelines to content creation. It should be used when the user asks to \"write an email\", \"draft a proposal\", \"create a pitch deck\", \"write a LinkedIn post\", \"draft a presentation\", \"write a Slack message\", \"draft sales content\", or any content creation request where brand voice should be applied. Also triggers on \"on-brand\", \"brand voice\", \"enforce voice\", \"apply brand guidelines\", \"brand-aligned content\", \"write in our voice\", \"use our brand tone\", \"make this sound like us\", \"rewrite this in our tone\", or \"this doesn't sound on-brand\". Not for generating guidelines from scratch (use guideline-generation) or discovering brand materials (use discover-brand).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1804,1805,1808,1809],{"name":1791,"slug":1792,"type":16},{"name":1806,"slug":1807,"type":16},"Communications","communications",{"name":14,"slug":15,"type":16},{"name":1795,"slug":1796,"type":16},"2026-04-06T18:00:23.528956",200,{"items":1813,"total":1990},[1814,1833,1845,1857,1876,1887,1908,1928,1938,1953,1961,1974],{"slug":1815,"name":1815,"fn":1816,"description":1817,"org":1818,"tags":1819,"stars":1830,"repoUrl":1831,"updatedAt":1832},"algorithmic-art","create algorithmic art with p5.js","Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1820,1823,1824,1827],{"name":1821,"slug":1822,"type":16},"Creative","creative",{"name":1709,"slug":1710,"type":16},{"name":1825,"slug":1826,"type":16},"Generative Art","generative-art",{"name":1828,"slug":1829,"type":16},"JavaScript","javascript",161831,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills","2026-04-06T17:56:15.455818",{"slug":1834,"name":1834,"fn":1835,"description":1836,"org":1837,"tags":1838,"stars":1830,"repoUrl":1831,"updatedAt":1844},"brand-guidelines","apply Anthropic brand colors and typography","Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1839,1840,1841],{"name":1791,"slug":1792,"type":16},{"name":1709,"slug":1710,"type":16},{"name":1842,"slug":1843,"type":16},"Typography","typography","2026-04-06T17:56:05.042852",{"slug":1846,"name":1846,"fn":1847,"description":1848,"org":1849,"tags":1850,"stars":1830,"repoUrl":1831,"updatedAt":1856},"canvas-design","create posters and visual art as PNG or PDF","Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1851,1852,1853],{"name":1821,"slug":1822,"type":16},{"name":1709,"slug":1710,"type":16},{"name":1854,"slug":1855,"type":16},"PDF","pdf","2026-04-06T17:56:03.794732",{"slug":1858,"name":1858,"fn":1859,"description":1860,"org":1861,"tags":1862,"stars":1830,"repoUrl":1831,"updatedAt":1875},"claude-api","build apps with the Claude API","Reference for the Claude API \u002F Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude\u002FAnthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing\u002Fmodel choice\u002Flimits\u002Fcaching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent\u002FMCP\u002Ftool-definition\u002Fmulti-agent\u002FRAG\u002FLLM-judge\u002Fcomputer-use; generate\u002Fsummarize\u002Fextract\u002Fclassify\u002Frewrite\u002Fconverse over NL; debugging refusals\u002Fcutoffs\u002Fstreaming\u002Ftool-calls\u002Ftokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI\u002FGPT\u002FGemini\u002FLlama\u002FMistral\u002FCohere\u002FOllama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1863,1866,1867,1870,1872],{"name":1864,"slug":1865,"type":16},"Agents","agents",{"name":9,"slug":8,"type":16},{"name":1868,"slug":1869,"type":16},"Anthropic SDK","anthropic-sdk",{"name":1871,"slug":1858,"type":16},"Claude API",{"name":1873,"slug":1874,"type":16},"LLM","llm","2026-07-28T05:36:08.213335",{"slug":1877,"name":1877,"fn":1878,"description":1879,"org":1880,"tags":1881,"stars":1830,"repoUrl":1831,"updatedAt":1886},"doc-coauthoring","co-author documentation and technical specs","Guide users through a structured workflow for co-authoring documentation. Use when user wants to write documentation, proposals, technical specs, decision docs, or similar structured content. This workflow helps users efficiently transfer context, refine content through iteration, and verify the doc works for readers. Trigger when user mentions writing docs, creating proposals, drafting specs, or similar documentation tasks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1882,1883],{"name":1759,"slug":1760,"type":16},{"name":1884,"slug":1885,"type":16},"Technical Writing","technical-writing","2026-04-06T17:56:14.18897",{"slug":1888,"name":1888,"fn":1889,"description":1890,"org":1891,"tags":1892,"stars":1830,"repoUrl":1831,"updatedAt":1907},"docx","create and edit Word documents","Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files) or Word templates (.dotx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', '.dotx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1893,1896,1898,1901,1904],{"name":1894,"slug":1895,"type":16},"Documents","documents",{"name":1897,"slug":1888,"type":16},"DOCX",{"name":1899,"slug":1900,"type":16},"Office","office",{"name":1902,"slug":1903,"type":16},"Templates","templates",{"name":1905,"slug":1906,"type":16},"Word","word","2026-07-18T05:16:23.136271",{"slug":1909,"name":1909,"fn":1910,"description":1911,"org":1912,"tags":1913,"stars":1830,"repoUrl":1831,"updatedAt":1927},"frontend-design","design production-grade frontend interfaces","Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1914,1915,1918,1921,1924],{"name":1709,"slug":1710,"type":16},{"name":1916,"slug":1917,"type":16},"Frontend","frontend",{"name":1919,"slug":1920,"type":16},"React","react",{"name":1922,"slug":1923,"type":16},"Tailwind CSS","tailwind-css",{"name":1925,"slug":1926,"type":16},"UI Components","ui-components","2026-04-06T17:56:16.723469",{"slug":1929,"name":1929,"fn":1930,"description":1931,"org":1932,"tags":1933,"stars":1830,"repoUrl":1831,"updatedAt":1937},"internal-comms","write internal company communications","A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenever asked to write some sort of internal communications (status reports, leadership updates, 3P updates, company newsletters, FAQs, incident reports, project updates, etc.).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1934,1935,1936],{"name":1806,"slug":1807,"type":16},{"name":1902,"slug":1903,"type":16},{"name":1795,"slug":1796,"type":16},"2026-04-06T17:56:20.695522",{"slug":1939,"name":1939,"fn":1940,"description":1941,"org":1942,"tags":1943,"stars":1830,"repoUrl":1831,"updatedAt":1952},"mcp-builder","build MCP servers","Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node\u002FTypeScript (MCP SDK).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1944,1945,1948,1949],{"name":1864,"slug":1865,"type":16},{"name":1946,"slug":1947,"type":16},"API Development","api-development",{"name":1873,"slug":1874,"type":16},{"name":1950,"slug":1951,"type":16},"MCP","mcp","2026-04-06T17:56:10.357665",{"slug":1855,"name":1855,"fn":1954,"description":1955,"org":1956,"tags":1957,"stars":1830,"repoUrl":1831,"updatedAt":1960},"read edit and manipulate PDF files","Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text\u002Ftables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting\u002Fdecrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1958,1959],{"name":1894,"slug":1895,"type":16},{"name":1854,"slug":1855,"type":16},"2026-04-06T17:56:02.483316",{"slug":1962,"name":1962,"fn":1963,"description":1964,"org":1965,"tags":1966,"stars":1830,"repoUrl":1831,"updatedAt":1973},"pptx","create and edit PowerPoint presentations","Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. If a .pptx or .potx file needs to be opened, created, or touched, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1967,1970],{"name":1968,"slug":1969,"type":16},"PowerPoint","powerpoint",{"name":1971,"slug":1972,"type":16},"Presentations","presentations","2026-07-18T05:16:24.1471",{"slug":1975,"name":1975,"fn":1976,"description":1977,"org":1978,"tags":1979,"stars":1830,"repoUrl":1831,"updatedAt":1989},"skill-creator","create and optimize agent skills","Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1980,1981,1982,1985,1988],{"name":1864,"slug":1865,"type":16},{"name":1759,"slug":1760,"type":16},{"name":1983,"slug":1984,"type":16},"Evals","evals",{"name":1986,"slug":1987,"type":16},"Performance","performance",{"name":1884,"slug":1885,"type":16},"2026-04-19T06:45:40.804",490]