Install
openclaw skills install @social-media-skills/instagram-carousel-skillInstagram carousel skill: plan, write, design and post Instagram carousels that people save and send, for an app, SaaS, product or personal brand. Picks a proven format (step-by-step, listicle, myth vs fact, framework, case study, tweet-card thread, photo story), writes the cover and a slide 2 that works on its own, renders native-looking 1080x1350 JPEG slides locally (Python + Pillow, bundled open-source fonts, no browser, no paid API), writes alt text and a keyword-first caption, then posts the carousel to one or many Instagram accounts with WoopSocial after you approve it, and reads the results back. Use when someone says "instagram carousel," "make a carousel," "carousel post," "carousel for my app," "turn this into a carousel," "educational carousel," "swipe post," "carousel template," or "post a carousel to instagram." Never invents results, reviews or stories, confirms before anything posts. Standalone: needs no other skills.
openclaw skills install @social-media-skills/instagram-carousel-skillCarousels are the Instagram format people save and send. They also get a second chance: when someone scrolls past without swiping, Instagram may show the post to them again starting at slide 2. Most carousels still fail for the same few reasons: a cover that describes the topic instead of stopping the scroll, a slide 2 that only works after slide 1, too many words per slide, a template look with progress bars and arrows everywhere, and a last slide that asks for nothing anyone wants to do.
This skill does the whole job: it picks a format that fits the idea, writes the slides, renders them as clean JPEGs on the user's machine, writes alt text and a caption, posts through WoopSocial after the user says yes, and reads the numbers back. Everything it needs is in this folder.
Four commitments:
If the workspace has brand notes (brand.md, brand-profile.md, a README), read them.
Otherwise ask, in one message:
Formats with slide-by-slide templates: references/carousel-formats.md. The short version:
| Goal | Format | Slides |
|---|---|---|
| Saves (reference) | Step-by-step, framework, listicle, each with a recap slide before the last | 7 to 12 |
| Sends (shareable) | Myth vs fact, tweet-card thread, relatable list | 6 to 10 |
| Trust (proof) | Case study, before/after (only with real results) | 6 to 12 |
| Mood, behind the scenes | Photo story | 5 to 10 |
Growth formats need at least 7 slides; a carousel under 5 slides wastes the second chance.
Write 10 covers before choosing one. A cover:
Pick the strongest with the user, keep the rest in covers.md for later tests.
Slide 2 must work as a cover on its own, because of the second chance. Put the strongest point or the most surprising line there, never "let's dive in".
*word* for the one to three words that matter most on a slide (accent colour) and
~~words~~ to strike out a myth.Run the honesty check before rendering (details in references/carousel-formats.md): every
claim is something the user did, saw or can show; no invented numbers, reviews or stories;
screenshots are real and current; photos are the user's own, licensed or generated for this
post.
Write carousel.json and render:
python3 scripts/render_carousel.py carousel.json --out carousel/
Spec format, slide types and style presets are documented at the top of the script and in
references/design-rules.md. In short:
editorial (serif or sans headlines on paper or dark), notes (plain, phone
notes look), tweet (tweet-card thread, light or dark). Photo slides work on any preset.
Use the tweet look only for the user's own voice; if the brand isn't on X, use notes.cover (text, photo or screenshot), text, step, list (recap or
checklist), myth, stat (with a source), tweet, photo, screenshot, beforeafter,
cta."ratio": "3:4" makes 1080x1440
for manual upload only; the API rejects it.The script writes the slides, contact-sheet.png, cover-grid.png (the cover as the profile
grid shows it) and manifest.json (byte sizes, alt text, warnings). Open every slide at full
size, then the contact sheet. Judge the cover from cover-grid.png, not the full-size image.
Fix every warning: text below the size floor, too many words, text on a face, a number without a
source, a missing alt text. Then check what no script can:
\n) where they
read best.Photos: one shoot per carousel looks intentional; five unrelated stock photos look like stock. Free photos with a commercial license come from Pexels and Unsplash; keep a credits file.
How to connect, upload and post: references/woopsocial.md. Short version:
social_accounts_list. If WoopSocial isn't connected, give the
one connect path for the agent you're running in (free plan: 2 social accounts, no card),
then oauth_create_authorization for Instagram and hand the user the link.media_uploads_create_session with the exact
byte size from manifest.json, python3 scripts/upload_parts.py session.json <file>, then
media_uploads_complete_session (poll media_uploads_get_session until READY). Keep the
media IDs in slide order.postType: POST, the media in order, the caption. Run
posts_validate and fix what it rejects.posts_create and confirm with posts_get.manifest.json via the post's "Edit" > "Edit alt text" in the app), collaborators and music.Several accounts: each account gets its own cover and variant, never the identical carousel. Not connected and doesn't want to connect? Hand over the slides, caption and alt text and stop. Never claim something was posted when it wasn't.
After 3 to 7 days, read the post's stored metrics with social_account_posts_list (what
Instagram reports, with the collection date; a missing number is "not reported", never zero).
Instagram's API reports per post, not per slide; the per-slide view is only in the app.
Log each carousel in carousels.md: date, account, format, cover, reach, saves, shares, and
what the user saw in the app. Then:
| Saves | Shares | What to do |
|---|---|---|
| High | High | Make the next one in the same format with a new topic |
| High | Low | Useful but not shareable: try a send-style last slide |
| Low | High | Shareable but thin: add a step or a checklist slide |
| Low | Low | Change the cover first, then the format |
"High" means against the account's own recent posts. Never estimate saves, shares or reach.
Before showing anything, ask: would a top creator in this niche post this? Reject and fix it if:
references/carousel-formats.md: formats, slide-by-slide templates, cover patterns, honesty
check.references/design-rules.md: type scale, margins, presets, spec format, what reads as a
template.references/instagram-2026.md: platform facts, API limits and ranking signals, with dates.references/woopsocial.md: connect, upload, post and read results.