instagram-agent-skill README

The project's README from github.com/Jakeschincariol/instagram-agent-skill. As one markdown file: README.md.

The Instagram agent skill

Thirteen Claude skills that run an Instagram account. Free, MIT, no signup, no API key, nothing to connect.

One of them writes your Reels off 26 hook formulas and scores the hook before you waste a take on it. One goes and finds the reels that are actually working in your niche and ranks them by how far each beat its own account. One writes the caption and shows you exactly what the feed shows before the "... more". One scores your profile out of 100 and rewrites what lost points. One plans the week.

And one is the humanizer, which is the reason the rest are usable. It strips the em dashes, the slop vocabulary and the invisible watermark characters out of a draft, then scores what is left against a five-check panel before you ever see it.

Nothing gets posted until you say yes. These skills write. You post.

Install

Paste this into Claude:

https://github.com/Jakeschincariol/instagram-agent-skill

Install this skill, then confirm /ig-reel works.

Or do it yourself, in Claude Code:

git clone https://github.com/Jakeschincariol/instagram-agent-skill.git
cp -r instagram-agent-skill/skills/ig-* ~/.claude/skills/

Or as a plugin:

/plugin marketplace add Jakeschincariol/instagram-agent-skill
/plugin install instagram-agent

Project-local instead of global: copy the same folders into your repo's .claude/skills/. No Claude Code at all? Paste any single SKILL.md at the top of a chat and it runs as a mode. You lose the five Python tools, which is most of the point of /ig-reel and /ig-human, but the rest works.

Then spend ten minutes on templates/voice.md. Copy it to ~/.claude/instagram/voice.md and fill it in, or send Claude three of your own reels and say "write my voice.md from these". Every skill reads that file. It matters more here than on other platforms, because you have to say the words out loud.

The thirteen

command what it does
/ig-reel One idea into a Reel. Three hooks from 26 formulas, scored, then the script, the on-screen text and a timed beat sheet.
/ig-viral Goes and finds what is working in your niche, ranks it by multiple over each account's own median, names the formula, writes the swipe file.
/ig-caption The caption, linted. Shows you the 125 characters the feed actually shows before the tap.
/ig-carousel Swipe posts. The cover that earns the swipe, slide copy, and the 1080x1350 files.
/ig-story The daily story sequence, which sticker does which job, and the DM funnel that starts with them moving first.
/ig-profile Scores your profile against a 12-part rubric out of 100, then rewrites in fix-first order.
/ig-plan The week. What to post, which format, when, and the 10 accounts to engage with.
/ig-human The humanizer. Two scripts that actually run. See below.
/ig-comment Comments on other people's posts. Nine types, picked by what the post actually is. Never "🔥🔥🔥".
/ig-reply The thread under your own post. Sorts into keyword / lead / substance / question / support / noise, then writes in that order.
/ig-dm The keyword delivery, the first message, the collab pitch, and the two follow-ups. Two.
/ig-repurpose One video, podcast or newsletter into a week of reels and carousels that each stand alone.
/ig-audit Post-mortem on what you already posted. Ranks by outlier multiple and sends per reach, not views.

The five tools that actually run

No dependencies, no network, nothing uploaded. They run on your machine, on your text.

Hooks

python3 hookscore.py hooks.txt              # rank your options
python3 beats.py script.txt --target 30     # time it before you shoot it
HOOK RANKING
==============================================================================
->  85.6 STRONG  Nobody tells you that your first 30 reels are supposed to f...
        weakest: SPECIFICITY (75)
    81.4 STRONG  I lost $18,000 because of one missing contract.
        weakest: ADDRESS (70)
    54.4 OK      Stop scrolling if you want to grow on Instagram in 2026 🔥
        weakest: STAKES (70)
        dealbreaker: Opens with "stop scrolling". Asking for attention proves
                     you have not earned it.
     9.6 WEAK    Hey guys, today I wanted to talk about content strategy
        weakest: FRONTLOAD (0)
        dealbreaker: Greeting. Nobody came to the feed to be greeted.

beats.py estimates how long each line takes to say, stacks them into timecodes, and flags the four things that kill a Reel in the edit: a hook that runs past three seconds, a beat long enough for the viewer to leave, a run of lines with nothing concrete in them, and no loop back to the first line.

BEAT SHEET  ·  73 words  ·  ~26.6s at 165 wpm  ·  target 30.0s
========================================================================
  0:00.0   2.9s  HOOK    I lost $18,000 because of one missing contract.
  0:02.9  14.6s  MID     Here is the exact clause I now put in every single...
                         ^ 14.6s on one beat
  0:17.4   2.9s          Section 4. Payment on delivery, not on approval.
  0:20.4   2.9s          Approval is a feeling. Delivery is a date.
  0:23.3   3.3s  CTA     That one word change is worth $18,000 to me.
------------------------------------------------------------------------
  - Beat 2 runs past 4s. Either split the line or change what is on screen
    inside it. A static frame is where people leave.
  - Loops: the last beat repeats "$18,000" from the hook. Second watches are
    free reach.
  - 3.5s under target. Either add 9 words or shoot it short. Short is usually
    right.

The caption

python3 caption.py caption.txt --keywords "client contracts,freelance pricing"

Instagram gives a caption about 125 characters in the feed and hides the rest behind a tap. Almost every caption that fails, fails there. So the first thing this prints is that window, as a box, the way a scrolling stranger reads it:

  WHAT THE FEED SHOWS
  +------------------------------------------------------+
  | I lost $18,000 because of one missing clause in a    |
  | contract, and the worst part is that I had read the  |
  | thing twice before I si                              |
  +-------------------------------------------- ... more +

  PASS  LENGTH            389 / 2200 characters
  WARN  FIRST LINE        133 characters, so it gets cut at 125 mid-thought
  PASS  HOOK IS CONCRETE  2 numbers or names in the visible window
  PASS  HASHTAGS          3 tags: #freelance #contracts #agencyowner
  PASS  ONE ASK           one call to action: comment a keyword
  WARN  SEARCH TERMS      1/2 present. Missing: client contracts

It enforces the current hashtag cap, which is five per post, not thirty. Instagram cut it on 18 December 2025.

The humanizer

python3 humanize.py draft.txt --report      # clean it, show every change
python3 detect.py draft.txt                  # score it, five checks
python3 detect.py before.txt after.txt       # prove the delta

What comes out automatically:

What gets flagged instead of fixed: "It's not just X, it's Y", rule-of-three triads, the video preamble, emoji bullet lists, three shouted words in a row, hashtag walls, reflex follow bait, uniform sentence length. Changing the shape of a sentence needs judgement, so those come back for a rewrite rather than getting mangled by a regex.

Run against a caption written to be as bad as possible:

  BURSTINESS    ###################.....  78.4
  SPECIFICITY   #############...........  53.6    3.4 concrete markers per 100 words
  SLOP DENSITY  ........................   0.0    20 stock terms, 23.0 per 100 words
  FINGERPRINT   ################........  68.7    1 em dash
  VOICE         #################.......  70.0    9 structural tells
  ------------------------------------------------------------
  HUMAN SCORE   ########................  32.5   FLAGGED

After humanize.py, with the flagged structures still unrewritten:

  HUMAN SCORE   ###################.....  79.7   PASS    (+47.2)

The swipe file

python3 swipe.py captured.tsv --out ~/.claude/instagram/swipe.md

Raw views are not evidence. A 2,000,000-follower account doing 400,000 views had a quiet Tuesday. A 4,000-follower account doing 400,000 views found something. swipe.py ranks on the multiple over each account's own median, names the hook formula, and prints what separates the top third from the bottom third.

SWIPE FILE  ·  4 reels  ·  4 accounts  ·  baseline: account median
==============================================================================
    60.0x  hook  57  #9  The Steal              @c                 180,000
           "steal this four line follow up it took me two years"
    37.5x  hook  86  #3  Nobody Tells You       @a                 412,000
           "nobody tells you that your first 30 reels are supposed to flop"
     1.3x  hook  13  -   unclassified           @b               1,200,000
           "in this video I am going to show you my morning routine"

What I actually measured, which is the part worth reading

I did not want to publish a hook scorer on the claim that it feels right, so I tested it. The corpus is 74 real short-form hooks: the first three seconds of the auto-caption track from the top eight and bottom eight performing shorts on each of five channels, view counts from 931 to 550,000.

They are YouTube Shorts rather than Reels, because Instagram does not hand you view counts you can collect without logging into somebody's account, and scraping it would violate the Terms this repo tells you not to violate. The hook grammar is the same and the sourcing is public. That is a real limitation and it is stated here rather than buried.

Three results, two of them uncomfortable:

1. It catches bad hooks well. Against ten hooks written deliberately badly, AUC 0.83, and nine of the ten scored below the median of the real corpus. If your hook opens on a greeting, a preamble or nothing concrete, this tells you.

2. It does not pick winners. Separating a good creator's hits from that same creator's misses: AUC 0.56, where 0.50 is a coin flip. Of the five checks, only SPECIFICITY separated the bands meaningfully, by 60 points of median. STAKES and ADDRESS had identical medians in both bands, which means on this corpus they measured nothing.

So the honest use is: kill the obviously weak hooks before you shoot them, then trust your own retention graph. Nothing that reads text can tell you which of two decent hooks will travel, because that is decided by your face, your edit, your audio and who Instagram shows it to.

3. The formula classifier was broken and the test is what caught it. The match regexes in hooks.json were written off my own templates, and they named 8% of real hooks. People do not speak in templates. Rewriting them against actual transcribed speech took it to 49%, and four formulas went into the set because they kept appearing and were not there: Contrarian Flip, The Statistic, The Reveal, Someone Else's Result, plus The Superlative. On the other 51% it abstains, which is correct: a lot of short-form is podcast clips that have no hook formula at all.

One fixed bug worth naming: SPECIFICITY only counted digits, so "zero dollars" and "three marketing books" scored as having nothing concrete in them. Spoken hooks say their numbers out loud.

If you re-run this on a bigger or cleaner corpus and get a different answer, I would rather know. The measurement script is not in the repo because it depends on yt-dlp, but the method is four lines and is written out in /ig-viral.

The fine print, which is the honest part

These skills do not post to Instagram. There is a real Content Publishing API for Professional accounts, and it needs a Meta developer app, a linked Page, a long-lived token and app review, which is not a thing a skill can hand you. Everything else people use to automate posting, commenting, following or DMing is browser automation or a third-party tool, and both violate Instagram's Terms of Use and get accounts action-blocked. So every skill here ends the same way: a copy-ready block, and you post it. That is not a limitation bolted on afterwards, it is the design, and it is why the approval gate is real rather than a setting.

The one exception is keyword auto-replies in DMs, which Instagram supports through its own tools and approved partners, and which only fire after somebody comments first. /ig-dm says where that line is.

/ig-viral reads, it does not scrape. Ten accounts, a dozen reels each, at human speed, with you driving your own browser. It never asks for your password and never logs in as you. Automated collection at volume is the thing that gets accounts restricted, and a crawler is not what this is.

The five detection checks are local heuristics, not detector APIs. They are modelled on the signals public detectors key on and they run entirely on your machine. They are not GPTZero, Originality, Copyleaks, Winston or Turnitin, they do not call those services, and they cannot promise those verdicts. Fixing what they measure tends to move those numbers, because they are measuring the same underlying things. That is the whole claim. Nobody can honestly sell you "undetectable", and anybody who does is selling you something.

The invisible-character pass is real and it is narrow. It removes the zero-width and format characters that end up in generated text and survive a copy-paste. That is a genuine, checkable fingerprint. It is not a claim about defeating a cryptographic watermarking scheme, and this repo does not make one.

Nothing here fabricates. No invented metrics, clients or outcomes go under your name. If a draft needs a number you have not given, it comes back with {{your number}} in it and a flag, every time.

Platform numbers go stale. The hashtag cap moved from 30 to 5 in December 2025 while this repo was being written, and the linter had the old number in it until the fact got checked. If something here contradicts what Instagram is doing when you read it, Instagram is right.

Files

skills/ig-reel/hooks.json          26 hook formulas: template, example, on-screen line,
                                   what it is for, how it gets ruined, and a match regex
skills/ig-reel/hookscore.py        the five-property hook panel
skills/ig-reel/beats.py            script to timed beat sheet
skills/ig-caption/caption.py       the truncation preview and the caption linter
skills/ig-human/slop.json          the lexicon: 154 terms, 18 invisible classes, 16 tells
skills/ig-human/humanize.py        the three cleaning passes
skills/ig-human/detect.py          the five-check panel
skills/ig-viral/swipe.py           outlier ranking and formula classification
skills/ig-profile/rubric.json      the 100-point profile score
templates/voice.md                 your voice profile. Fill this in first.

Credit

Made by Jake Schincariol, opusjake.ai.

Sibling repo, same idea for a different platform: linkedin-agent-skill.

License

MIT. Take it, change it, ship it.

instagram-agent-skill (Jakeschincariol/instagram-agent-skill)

free
Searching Database…

What is this?Thirteen Claude Skills that run an Instagram account end-to-end: Reels scripts scored against 26 hook formulas, a viral-research skill, a caption linter, a profile scorer, a weekly planner, and a text humanizer. It's free, MIT-licensed, and needs no signup or API key.
Is this a Claude Code plugin, or something else?It's a set of Claude Skills (SKILL.md files plus five local Python tools) that you load into Claude Code or Claude Desktop; it's not a standalone app, and it can also run as a one-off mode by pasting a single SKILL.md into any chat.
How do I install the skills?Paste the install block into Claude, clone or copy the skill folders manually in Claude Code, install it as a plugin, or copy the same folders into your repo's .claude/skills/ for a project-local install.
Do I need an Instagram or Meta API key to use it?No. The skills need Claude Code or Claude Desktop to run, but there's no Meta developer app, API key or signup required; without Claude Code you lose the five Python tools but the skills still work as chat-pasted prompts.
Does it actually post to Instagram for me?No, none of the skills post automatically. Every skill ends with a copy-ready draft that you review and post yourself, because automated posting, commenting or DMing violates Instagram's Terms of Use and risks the account being action-blocked.
Does any of my content or account data leave my machine?The five Python tools (hook scoring, caption linting, humanizer, swipe-file ranking) run entirely locally with no network calls; the viral-research skill reads public reels in your own browser at human speed and never logs in as you.
How accurate is the hook-scoring model?Tested against 74 real YouTube Shorts hooks, it catches deliberately bad hooks well (AUC 0.83) but is much weaker at predicting which of a creator's own good hooks will outperform the others (AUC 0.56, barely better than chance).
What does the humanizer skill actually fix?It strips invisible Unicode characters like zero-width spaces, converts typography such as em dashes and curly quotes, and swaps out 154 stock AI-sounding phrases from a local slop.json lexicon; structural issues like rule-of-three triads get flagged for manual rewrite instead of being auto-mangled.
Why benchmark against YouTube Shorts instead of Instagram Reels?Instagram doesn't expose view counts without logging into an account, and scraping that would violate its Terms, so the author used public YouTube Shorts auto-captions instead, since the underlying hook grammar is the same.
Can the skills reply to DMs automatically?Only keyword-triggered auto-replies after someone comments first, which Instagram supports natively through approved partners; the DM skill is scoped to stay inside that line.
Size
0.1 MB
Stars
1.8K
Updated
CommitSep 13
Age
1mo
Commits · 90 Days