{"slug": "instagram-carousel-skill-for-claude-code-write-render-and-post-carousels-from", "title": "Instagram Carousel Skill for Claude Code: Write, Render and Post Carousels From Your Agent", "summary": "A developer released the Instagram Carousel Skill, a free MIT-licensed agent skill that lets Claude Code, Claude, Codex, Cursor and OpenClaw plan, write, render and post Instagram carousels. The skill writes cover and slide copy, renders 1080x1350 JPEGs locally with a Pillow-based Python script, generates alt text and captions, and posts only after user confirmation, requiring no headless browser, image API or credits.", "body_md": "The Instagram carousel skill is a free, MIT-licensed agent skill that lets Claude Code, Claude, Codex, Cursor and OpenClaw plan, write, render and post Instagram carousels. It picks a format, writes the cover and the slides, renders 1080x1350 JPEGs on your machine with a small Python script, writes alt text and a caption, and posts the carousel once you say yes. No headless browser, no image API, no credits.\n\nRepo: [github.com/social-media-skills/instagram-carousel-skill](https://github.com/social-media-skills/instagram-carousel-skill)\n\n*Slides from the two example carousels in the repo. The brand \"plodd\" and its app screenshot are made up.*\n\nMost carousels that don't get saved fail in the same places, and each one maps to a rule in the skill:\n\n```\nnpx skills add social-media-skills/instagram-carousel-skill -g -a claude-code -y\n```\n\nOther agents:\n\n`openclaw skills install @social-media-skills/instagram-carousel-skill`\n`gh skill install social-media-skills/instagram-carousel-skill instagram-carousel-skill`\n`gemini extensions install https://github.com/social-media-skills/instagram-carousel-skill`\n`npx skills add social-media-skills/instagram-carousel-skill` and pick your agent.\nRendering needs Python 3.8+ and Pillow (`pip install pillow`). The fonts ship in the repo.\n\nA prompt like \"Make an Instagram carousel for my habit tracker about not giving up after a missed day\" starts a fixed sequence:\n\n`covers.md` for later tests.`carousel.json`, runs the renderer, opens every slide and the contact sheet, and fixes each warning.\n`scripts/render_carousel.py` turns a JSON spec into slides. It uses Pillow only, renders at 2x and downscales for sharp text, and bundles Inter and Instrument Serif under the SIL Open Font License. This is a shortened version of the spec behind the editorial example:\n\n```\n{\n  \"theme\": {\"preset\": \"editorial\", \"mode\": \"light\", \"headline_font\": \"serif\",\n            \"name\": \"plodd\", \"handle\": \"@plodd.app\", \"avatar\": \"avatar.png\"},\n  \"slides\": [\n    {\"type\": \"cover\", \"title\": \"Missed a day?\\nYour habit is *fine*.\",\n     \"kicker\": \"4 rules for people who restart every Monday\", \"alt\": \"...\"},\n    {\"type\": \"step\", \"number\": \"1\", \"title\": \"One missed day is noise. *Two* is a pattern.\",\n     \"body\": \"Protect one line: never miss twice in a row.\", \"alt\": \"...\"},\n    {\"type\": \"myth\", \"myth\": \"A habit takes 21 days\", \"fact\": \"Closer to *66 days*.\",\n     \"source\": \"Lally et al., European Journal of Social Psychology, 2010\", \"alt\": \"...\"},\n    {\"type\": \"screenshot\", \"title\": \"plodd counts your *week*\",\n     \"body\": \"Miss Wednesday. Still a good week.\", \"image\": \"screens/plodd-week.png\", \"alt\": \"...\"},\n    {\"type\": \"cta\", \"title\": \"Send this to the friend who restarts every Monday.\", \"alt\": \"...\"}\n  ]\n}\npython3 scripts/render_carousel.py carousel.json --out carousel/\n```\n\n`*word*` sets a word in the accent colour, `~~words~~` strikes out a myth, and `\\n` places a line break where the headline reads best.\n\n**Slide types:** `cover` (text, photo or screenshot), `text`, `step`, `list` (recap or checklist), `myth`, `stat` (needs a `source`), `tweet`, `photo`, `screenshot`, `beforeafter`, `cta`.\n\n**Presets:**\n\n| Preset | Look | Good for | \n|---|---|---|\n| `editorial` light or dark | Paper or near-black background, serif or heavy sans headlines, one accent | Step-by-step, frameworks, lists | \n| `notes` light or dark | Plain phone-notes look | Honest lists, lessons, lo-fi posts | \n| `tweet` light or dark | Tweet-card thread with your own name, handle and avatar | Opinions, short lessons | \n\n**Output:** `slide-01.jpg` and onward at 1080x1350 sRGB JPEG, plus:\n\n`contact-sheet.png`: every slide on one image, for review.` cover-grid.png`: the cover cropped the way the 3:4 profile grid shows it.` manifest.json`: byte size, alt text and text per slide, plus warnings.\nThe warnings are the part that saves review time: text below the size floor, too many words on a slide, a stat with no source, a missing alt text, and (with `opencv-python` installed) text sitting on a face. When text doesn't fit at the floor, the fix is to split the slide, not to shrink it.\n\nMeta's content publishing API accepts JPEG only, with an aspect ratio between 4:5 and 1.91:1, and crops every carousel item to the ratio of the first one. So 4:5 at 1080x1350 is the tallest size that posts through the API, and every slide is rendered at exactly that size. The Instagram app has accepted 3:4 (1080x1440) since May 2025 but the API still rejects it; set `\"ratio\": \"3:4\"` only for slides you will upload by hand.\n\nThe type scale is set for phone reading, not for a desktop preview: a 1080 px slide shows at roughly a third of its width on a phone, so body text sits at 54 px with a floor of 40, and slide headlines at 128 px serif or 96 px sans.\n\nThe renderer has no agent dependency. You can call it from a script, a CI job or a cron task with your own spec.\n\nPosting goes through the [WoopSocial](https://woopsocial.com/?utm_source=instagram-carousel-skill&utm_medium=devto) MCP server, a social media API for AI agents. The skill is maintained by Frank Heijdenrijk and the team behind WoopSocial. The free plan covers 2 social accounts with posting, scheduling and analytics included. Setup for each agent is at [woopsocial.com/agents](https://woopsocial.com/agents?utm_source=instagram-carousel-skill&utm_medium=devto).\n\nThe posting step, in tool calls:\n\n`social_accounts_list` to check the connection. If Instagram isn't connected, `oauth_create_authorization` returns a link for you to approve.`media_uploads_create_session` with the exact byte size from `python3 scripts/upload_parts.py session.json carousel/slide-01.jpg`, then `media_uploads_complete_session`. Media IDs stay in slide order.` postType: POST`, the caption, and `PUBLISH_NOW`, `SCHEDULE_FOR_LATER` or `DRAFT`.` posts_validate`, then the confirmation: contact sheet, caption, account and time with timezone. `posts_create` runs only after your yes, and `posts_get` reports the result.\nFor several Instagram accounts, each account gets its own cover and variant instead of the identical carousel.\n\nWoopSocial doesn't write captions, crop media or set alt text, collaborators or music on Instagram. The skill writes the caption and alt text itself, and after posting it tells you to paste each slide's alt text from `manifest.json` into the app (Edit > Edit alt text). If you'd rather not connect anything, it hands over the slides, caption and alt text and stops there.\n\nAfter 3 to 7 days the agent calls `social_account_posts_list`, which returns the stored post metrics Instagram reports (views, likes, comments, saves, shares) with their collection date. A missing number is logged as \"not reported\", never as zero. Instagram's API reports per post, not per slide, so per-slide views stay in the app.\n\nEach carousel goes into `carousels.md` with its date, format and cover, and the next step comes from comparing it with the account's own recent posts:\n\n| Saves | Shares | Next carousel | \n|---|---|---|\n| High | High | Same format, new topic | \n| High | Low | Useful but not shareable: try a send-style last slide | \n| Low | High | Shareable but thin: add a step or a checklist slide | \n| Low | Low | Change the cover first, then the format | \n\nThe skill is MIT-licensed: [github.com/social-media-skills/instagram-carousel-skill](https://github.com/social-media-skills/instagram-carousel-skill). More free skills for social media work are at [social-media-skills.com](https://social-media-skills.com).\n\nIf you render a carousel with it, which preset did you start with, and what did the warnings catch?", "url": "https://wpnews.pro/news/instagram-carousel-skill-for-claude-code-write-render-and-post-carousels-from", "canonical_source": "https://dev.to/fheijdenrijk/instagram-carousel-skill-for-claude-code-write-render-and-post-carousels-from-your-agent-1odp", "published_at": "2026-10-28 09:31:35+00:00", "updated_at": "2026-10-28 09:41:17.457307+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "generative-ai"], "entities": ["Instagram", "Claude Code", "Anthropic", "OpenAI Codex", "Cursor", "OpenClaw", "Pillow", "GitHub"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/instagram-carousel-skill-for-claude-code-write-render-and-post-carousels-from", "markdown": "https://wpnews.pro/news/instagram-carousel-skill-for-claude-code-write-render-and-post-carousels-from.md", "text": "https://wpnews.pro/news/instagram-carousel-skill-for-claude-code-write-render-and-post-carousels-from.txt", "jsonld": "https://wpnews.pro/news/instagram-carousel-skill-for-claude-code-write-render-and-post-carousels-from.jsonld"}}