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)

Searching Database…

这是什么?十三个端到端运营 Instagram 账号的 Claude 技能:对照 26 个钩子公式打分的 Reels 脚本、爆款调研技能、文案检查器、主页评分器、周计划器,以及文本去 AI 味工具。它免费、采用 MIT 许可证,无需注册或 API 密钥。
这是 Claude Code 插件,还是别的东西?它是一组 Claude 技能(SKILL.md 文件外加五个本地 Python 工具),需要加载到 Claude Code 或 Claude Desktop 中;它不是独立应用,把单个 SKILL.md 粘贴到任意对话里也能以一次性模式运行。
这些技能怎么安装?把安装代码块粘贴到 Claude、在 Claude Code 中手动克隆或复制技能文件夹、作为插件安装,或者把同样的文件夹复制到仓库的 .claude/skills/ 进行项目级本地安装。
使用它需要 Instagram 或 Meta 的 API 密钥吗?不需要。这些技能要在 Claude Code 或 Claude Desktop 中才能运行,但不需要 Meta 开发者应用、API 密钥或注册;没有 Claude Code 会失去五个 Python 工具,但技能本身作为粘贴进对话的提示词仍然可用。
它真的会替我发 Instagram 吗?不会,没有任何技能会自动发帖。每个技能的产出都是一份可直接复制的草稿,由你审阅后自行发布,因为自动发帖、评论或发私信违反 Instagram 的使用条款,并有导致账号操作被封禁的风险。
我的内容或账号数据会离开我的电脑吗?五个 Python 工具(钩子打分、文案检查、去 AI 味、素材库排序)完全在本地运行,没有任何网络请求;爆款调研技能以人类速度在你自己的浏览器里阅读公开 Reels,绝不会以你的身份登录。
钩子打分模型有多准?在 74 个真实 YouTube Shorts 钩子上测试后发现,它很擅长识别刻意写差的钩子(AUC 0.83),但在预测创作者自己的好钩子中哪个会更胜一筹方面弱得多(AUC 0.56,仅略好于随机)。
去 AI 味技能究竟修的是什么?它会清除零宽空格之类的不可见 Unicode 字符,转换破折号和弯引号等排版符号,并按本地 slop.json 词库替换 154 个典型的 AI 腔短语;像“三段式排比”这类结构性问题只会被标记出来等人工改写,而不会被自动改坏。
为什么用 YouTube Shorts 而不是 Instagram Reels 做基准?Instagram 不登录账号就看不到播放量,而抓取会违反其条款,所以作者改用公开的 YouTube Shorts 自动字幕,因为底层的钩子语法是一样的。
这些技能能自动回复私信吗?只能在对方先评论后进行由关键词触发的自动回复,这是 Instagram 通过认证合作伙伴原生支持的功能;私信技能的范围严格控制在这条界线之内。
Size
0.1 MB
Stars
2K
Updated
CommitSep 13
Age
1mo
Commits · 90 Days