Draft an Instagram caption with the hook in the first 125 characters, a skimmable body, and one clear CTA, using a 2026 hook formula chosen by goal (saves, shares, comments, follows). Runs the humanizer pass and, on approval, publishes with the image or video you supply via the Publora media flow. Use to caption a single image or a Reel. Not for slide-by-slide carousels (use ig-carousel-planner) or auditing a draft (use ig-humanizer --mode audit).
npx skills add https://github.com/sergebulaev/instagram-skills --skill ig-caption-writer
Write a caption that earns the tap and the save. Instagram hides everything after
~125 characters behind "more", so the hook does the entire job in the first
line. This skill front-loads that hook, keeps the body skimmable, and lands one
clear call to action.
| Code | Formula | Primary goal | Best for |
|---|---|---|---|
| IG1 | Number-First Result | saves | one odd-precision result + a "steal this" promise |
| IG2 | Contrarian Truth | shares | a sharp, defensible against-the-grain claim |
| IG3 | Relatable Cold-Open | comments | a specific shared moment, no setup |
| IG4 | Mini-Story Confession | comments, follows | a real first-person story with a cost |
Full skeletons in ../../references/hook-formulas.md. For carousels (IG5-IG8) use
ig-carousel-planner; for Reels (IG9-IG10) the hook lives in the video, and this
skill writes the supporting caption.
| Goal | Reach for |
|---|---|
| Saves | IG1 |
| Shares | IG2 |
| Comments | IG3, IG4 |
| Follows | IG4 |
Voice profile first (all drafts). If ../../references/voice-profile.md has filled: yes, load it and match the user's voice fingerprint, hard rules, and CTA/link style throughout. If it is not filled, mention once that ig-humanizer --mode profile can learn their voice from a few posts, then proceed with the generic voice rules.
audience, and the goal (saves / shares / comments / follows).
also fit the topic and let the user choose.
number before the "more" fold and make sense on its own.
tell the story that the hook promised. Keep it under 2,200 chars.
launch", "send to the friend who keeps doing #2"), a real question, or a
single next step. Never "what do you think?".
ig-hashtag-strategist or apply the3-5 sized set yourself (see ../../references/hashtag-strategy.md). Put them at
the end or note they go in the first comment.
dashes (about one per 100 words; a caption's single dash is not a tell,
never swap one for a period), break stacked triads, generic openers and
reveal bridges. Fix only a paragraph that reads machine-flat; never
manufacture variance or one-word lines for drama. Add an odd-precision
number with a named referent or a named entity where the claim allows.
Canonical rules: ig-humanizer V3.
ig-humanizer --mode audit for a pass-fail check.full caption, char count, hashtag set, primary goal, and the media the user
must supply.
10. On approval, publish with media. Call `lib.publish(kind="post",
draft_text=<approved caption>, target_url="https://www.instagram.com/",
media=[<local file paths>], platforms=[<INSTAGRAM_PLATFORM_ID>],
scheduled_time=<iso_or_None>). For a Reel pass kind="reel"`. The wrapper
runs the Publora draft then upload then schedule flow. With no media or no
Publora key it returns a copy-paste block and a reminder to attach the media.
Global voice rules: see root SKILL.md Voice rules. Additional skill-specific
rules:
that needs the second line to make sense.
the user to attach the image or video.
../../references/hook-formulas.md - all 10 Instagram formulas (IG1-IG4 are caption-first)../../references/algorithm-heuristics.md - 2026 Instagram ranking rules../../references/hashtag-strategy.md - the 3-5 sized hashtag recipe../../references/media-workflow.md - the draft, upload, schedule flowreferences/caption-checklist.md - the per-caption scrub and fit listig-carousel-planner - when the idea is a slide-by-slide carouselig-hashtag-strategist - build the sized hashtag setig-humanizer - AI-tell scrubber, plus --mode audit for reviewig-hook-extractor - reverse-engineer a hook from a post you admireTake sergebulaev/ig-caption-writer from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.