ig-reel
Skill3 starsChanged 35 days agoMITView on GitHub
Write an Instagram Reel from one idea (scored hooks, spoken script, on-screen text, timed beat sheet), then publish or schedule it after approval.
10 other projects use a version of this, 7 of them edited.
Adopted by
Most recently taken up by
- diegotrigal/redes-sociales-latamtheir own version, first seen Nov 8, 2026
- aipphilie/claude-skillsedited, first seen Nov 1, 2026
- Oumi-Mez/Claude-skillsedited, first seen Oct 25, 2026
- nicojunk/claude-igtheir own version, first seen Oct 25, 2026
- workflownicojunk/claude-skillstheir own version, first seen Oct 20, 2026
- lodhaarihant/instagram-agent-arihantedited, first seen Oct 17, 2026
Used with
Projects with it also use ig-plan and ig-reply.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
JakeschincariolSkillig-plan
Build the week on Instagram - what to post, which format, when, and who to engage with. Use when the user says "plan my week", "what should I post", "content calendar", "I have nothing to post about", or wants a posting schedule and an engagement list.
Also in 8 projects that use this
vava2684Skillig-reply
Instagram 貼文留言智慧回覆。抓某篇貼文底下的新留言,由 Claude 在對話裡依貼文內容與留言者語言生成友善回覆,再透過 Graph API 自動送出。觸發時機:使用者說「回覆留言」「處理 IG 留言」「回 IG」「IG 自動回覆」「抓留言來回」「回我 IG 那篇」等。
Also in 7 projects that use this
Other versions10 projects use a version of this.
Word for word · 0
None found.
Edited · 7
- Jakeschincariol/instagram-agent-skill★ 8871% same
- postzen-dev/instagram-agent-skill★ 3464% same
- nessalazne/instagram-agent-skill★ 369% same
- aipphilie/claude-skills★ 071% same
- larkinmd7/instagram-agent-skill★ 071% same
- lodhaarihant/instagram-agent-arihant★ 071% same
- Oumi-Mez/Claude-skills★ 071% same
Wrote their own version · 3
- nicojunk/claude-ig★ 17same name
- diegotrigal/redes-sociales-latam★ 0same name
- workflownicojunk/claude-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository50 other files it gives its agents.
- automationsSkill
- commentsSkill
- hooksSkill
- ig-auditSkill
- ig-captionSkill
- ig-carouselSkill
- ig-dmSkill
- ig-humanSkill
- ig-profileSkill
- ig-storySkill
- ig-viralSkill
- inboxSkill
- linkedin-comment-drafterSkill
- linkedin-content-plannerSkill
- linkedin-employee-advocacySkill
- linkedin-engager-analyticsSkill
- linkedin-hook-extractorSkill
- linkedin-humanizerSkill
- linkedin-interviewerSkill
- linkedin-post-writerSkill
- linkedin-profile-optimizerSkill
- linkedin-reply-handlerSkill
- linkedin-repurposerSkill
- linkedin-thread-monitorSkill
- naver-ai-citeSkill
- naver-draftsSkill
- naver-engageSkill
- naver-keywordsSkill
- naver-postSkill
- performance-reviewSkill
- publishSkill
- repurposeSkill
- schedule-weekSkill
- setupSkill
- threadsSkill
- troubleshootSkill
- voice-profileSkill
- yt-auditSkill
- yt-benchmarkSkill
- yt-chaptersSkill
- yt-commentSkill
- yt-editSkill
- yt-packageSkill
- yt-planSkill
- yt-retentionSkill
- yt-scriptSkill
- yt-seoSkill
- yt-shortsSkill
- yt-uploadSkill
- yt-viralSkill
The file
We split this skill into the rules it gives an agent
11 rules. 2 are common, 2 are distinctive, and 7 are very specific to this project.
2
Common
Most of the 9 edited versions we read keep these.
2
Distinctive
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 26
If the idea is thin, do not pad it.
- Very specific: line 27
If the person has a swipe file from ig-viral, ask where it is and read it.
- Very specific: line 46
1. Pick three hooks, not one: Run the idea through scripts/hooks.json, choose three formulas that genuinely fit it, and write the spoken …
- Very specific: line 48
2. Score them: Put the three spoken lines in a file, one per line, and run scripts/hookscore.py.
- Very specific: line 54
5. Humanize it: Run the script through ig-human before showing it.
- Common: line 73
Write it separately, every time.
- Common: line 83
One idea per Reel: If the script has two, you have two Reels.
- Distinctive: line 85
Cut the intro: No greeting, no "in this video", no name, no logo sting.
- Very specific: line 88
Never fabricate: No invented metrics, clients, revenue or outcomes under the person's name, even as a placeholder.
- Very specific: line 120
Publish: Call publish with the accountIds from select_channels, content (the caption), mediaIds, the options, and wait: true.
- Very specific: line 123
If the reel asks for a keyword comment ("Comment CONTRACT"), the delivery is an automation: set it up with the automations skill …
“Common” is measured: kept by at least 6 in 10 of the 9 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Adapted from Jakeschincariol/instagram-agent-skill (MIT). Not affiliated with the original author.
ig-reel
Turns one raw idea into a Reel that somebody finishes. Use it whenever the person wants a Reel, a short-form video script, a hook or a voiceover ("make a reel about X", "what should I say in this video"), or is about to record and does not have the first line yet.
Two scripts live in this skill's scripts/ folder and they both actually run. Use them. Do not eyeball the hook and do not guess at the length. Run them from this skill's folder:
python3 scripts/hookscore.py hooks.txt # rank your hook options
python3 scripts/hookscore.py --hook "one line" # score a single one
python3 scripts/beats.py script.txt --target 30 # timed beat sheet before you shootBoth count English words. On Korean or other non-Latin text they see almost nothing (a Korean hook gets scored on its digits alone), so the score and the timings mean nothing there: say so, skip the numbers, and time the script by having the person read it out loud. An agent without a terminal cannot run them either; apply the rules below by reading and say that no score was computed.
Before you write
- Read the voice file
~/.uplika/<workspace-slug>/voice.mdif it exists: how the person talks on camera, what they never say, who they are talking to. If it does not exist, ask three questions (tone, how they end a line, words they avoid), or ask for three of their own reels and infer the voice from them, then offer to save it with thevoice-profileskill. A script in the wrong voice is unusable, because they have to say it out loud. - Read
scripts/hooks.json: 26 formulas, each with a template, a filled example, the on-screen version, what it is for, and how it gets ruined. Four of them are in there because they kept turning up in real hooks, not because they completed a pattern. Thehooksskill lists the same formulas next to other platforms' formulas and Korean patterns, when the person wants a wider menu. - If the idea is thin, do not pad it. Ask one batched question: what happened, to whom, and what did it cost or return. A Reel needs one specific true thing. Get it before writing.
- If the person has a swipe file from
ig-viral, ask where it is and read it. It is their own evidence about which formulas are working in their niche right now, and it beats the defaults in this file.
The shape
A Reel is decided in the first two seconds and kept by the next five.
0:00 - 0:02 HOOK the claim. Spoken line and on-screen line, written
separately. Motion in the first frame, not a static face.
0:02 - 0:07 THE STAKE why this matters to the person watching. One line.
0:07 - ... THE BODY one idea per beat, and the frame changes every beat.
LAST 3s THE PAYOFF deliver what the hook promised, then the single ask.
LAST LINE THE LOOP echo one word from the hook so the replay lands clean.Length: 15 to 45 seconds is the working range. The longest a Reel may run is in list_platforms, and almost nobody should go near it. Under 7 seconds the loop counts inflate and nothing else does.
The loop
1. Pick three hooks, not one. Run the idea through scripts/hooks.json, choose three formulas that genuinely fit it, and write the spoken line plus the on-screen line for each. Different formulas, not three rewrites of one.
2. Score them. Put the three spoken lines in a file, one per line, and run scripts/hookscore.py. Show the person the ranking. If the top one is under 50, you do not have the hook yet and no amount of editing fixes that.
3. Write the script on the winning hook. Plain spoken language, the way the person actually talks. Contractions. Short lines. No sentence they would have to rehearse.
4. Time it. Run scripts/beats.py script.txt --target {length}, with --wpm from the voice file if the person has timed themselves reading. Fix every flag it prints: a hook that runs too long, a beat long enough to lose people, a run of beats with nothing concrete in them, no loop. Re-run until it is clean.
5. Humanize it. Run the script through ig-human before showing it. A written-sounding line is obvious the moment someone says it out loud.
6. Print the block. The script in a fenced block, the on-screen text as a separate list with timings, and then:
REEL READY
hook: #3 Nobody Tells You, scored 86 STRONG
length: 28.4s across 9 beats at 165 wpm
on-screen: 6 cards
humanizer: 4 artefacts stripped, human score 81 PASS
caption: write it with ig-caption next
Reply "yes" to keep it, or tell me what to change.7. The person shoots it. This skill produces a script. Publishing the finished video is the Uplika section below, and only after the person approves.
On-screen text is a separate script
Write it separately, every time. It is read before it is heard.
- Six words or fewer per card. It is being read at arm's length by someone who is not listening yet.
- The hook card is up at frame 1, not after a beat of silence.
- Keep it inside the middle of the frame. The top band holds the profile row, the bottom band holds the caption and the audio strip, and the action rail runs down the right edge. Anything under them is covered.
- Never put the hook where the caption sits. That is the bottom of the frame and it is covered.
- Burn in captions for the body. Most people watch muted first.
Rules that make the difference
- One idea per Reel. If the script has two, you have two Reels. Say so.
- Numbers over adjectives. "$4,200" beats "a lot". If the person has not given a number, ask for one rather than writing around the hole.
- Cut the intro. No greeting, no "in this video", no name, no logo sting. The video starts at the sentence you would normally reach at second six.
- Change the frame every beat. A static shot for 8 seconds is where people leave, and
scripts/beats.pywill flag it. - One ask at the end. Comment a keyword, save it, or follow. One.
- Never fabricate. No invented metrics, clients, revenue or outcomes under the person's name, even as a placeholder. If a number is needed and unknown, leave
{{your number}}in the script and flag it. - Do not write a script around a trending audio the person cannot use. If the idea needs the person's own voice, say so. With Uplika connected, check
search_instagram_audiofirst: only audio in this account's results can go on the reel.
Example
/ig-reel we cut proposal time from 5 hours to 20 minutes with one templateHOOKS (scored)
86 STRONG #5 Time Collapse "Proposals used to take me five hours. Twenty minutes now."
on screen: 5 HOURS -> 20 MIN
71 STRONG #1 Cost Confession "I billed four hours a week for formatting. For two years."
on screen: 2 YEARS WASTED
54 OK #9 The Steal "Steal the proposal template that did it."
on screen: STEAL THIS
Shooting #5: the ratio is believable, it reads in one glance on screen,
and the number is yours.With Uplika connected
Once the person has the finished video, Uplika can publish or schedule it on their Instagram account.
- Account. Call
select_channelswith the Instagram account, or with no scope and let the person choose. Never assume Instagram is connected; if it is not, send the person to https://uplika.com/dashboard/connections. If the answer isworkspace_required, show the workspaces it lists, ask which one, and pass thatworkspaceIdon every later call. - Rules. Read Instagram in
list_platforms: video size and length, the caption limit and how it counts characters, the option schema underoptions, and the features table. Instagram posts cannot be edited after they go out (the features table says so), so the caption and every option are approved before publishing, not after. - Upload the video. With a terminal:
media_presignwith the file name, type and size, PUT the bytes to the returneduploadUrlwith curl (same content type), thenmedia_complete. Without one:media_from_urlfor a file at a public https address, ormedia_upload_linkfor a file on the person's device (give them the link, then pollmedia_upload_statusuntil it is ready). PassaiGeneratedwhen the footage was made with AI. - Cover. A chosen image goes in
options.instagram.coverMediaId(upload it the same way; the option schema says which format it takes). Its media id goes only in that option, never inmediaIds(that would add the image to the post itself). Otherwise pick a frame withoptions.instagram.thumbOffsetMs. A cover with a few words of text keeps the grid readable (seeig-profile). - Audio (optional). If the person wants music or a sound under the reel, call
search_instagram_audiowith the InstagramaccountId(and theworkspaceIdif you were given one). Withoutqueryit lists what is trending for this account: popular songs are only there, and the list differs per account (some accounts only get royalty-free music). Withqueryit searches Meta's royalty-free Sound Collection only, so an artist or song name will not find that song.previewUrlis a temporary audio file you can play;listenUrlopens the sound on Instagram. Put the chosen id inoptions.instagram.audiowith both volumes,{ "id": "...", "volume": 20, "videoVolume": 100 }for a reel with a voice-over (both default to 100, which drowns speech). It works only for accounts connected via Facebook; otherwise the answer isnot_supported, and the person reconnects through Facebook or publishes without audio. Instagram cannot preview the mix before it is published, and the audio plays once from its beginning (the start cannot be chosen) without repeating, so pick one at least as long as the reel: say so when you show the plan. - Show and confirm. Show the person everything that will go out: the account, the caption from
ig-caption, the cover, the audio (title, artist and both volumes) if any,options.instagram.contentTypeset toreel,options.instagram.shareToFeed(false keeps the reel out of the main feed), anyoptions.instagram.collaborators(they appear only after they accept), anyoptions.instagram.firstComment, and the time. Publish only after they approve. - Publish. Call
publishwith theaccountIdsfromselect_channels,content(the caption),mediaIds, the options, andwait: true. For a later time passscheduledAtwith a time zone offset; ask which time zone the person means instead of guessing. - Report. Call
get_postwith the returned id and give the person the status and the permalink. A wait that runs out is not a failure: the reel is usually still processing, so checkget_postagain instead of publishing twice. If the target failed, callget_helpwith its code and pass on the answer and its url.instagram_audio_unavailablemeans Instagram did not take that audio for this account: search again and publish with another id (retrying the same post would send the same audio). A published reel whose warning says the music may be missing went up, but Instagram lists its sound as the video's original audio: ask the person to listen in the app before posting it again.reconsent_required,feature_in_reviewandaccount_disconnectedgo to thetroubleshootskill.
If the reel asks for a keyword comment ("Comment CONTRACT"), the delivery is an automation: set it up with the automations skill (template:comment_to_dm), using the same keyword. For a scheduled reel, attach the automation after the reel goes out, with the published post's id.
Without Uplika
Everything before the Uplika section works with nothing connected: the scripts run locally on text and nothing is uploaded. Print the script, the on-screen list and the receipt. The person shoots the Reel and posts it from the Instagram app.
Tools
select_channels: pick the Instagram account; returns the accountIds and limitslist_platforms: reel and caption rules, the option schema, the features tablemedia_presign: upload slot when you can PUT the video yourselfmedia_complete: confirm that uploadmedia_from_url: attach a video or cover image from a public https addressmedia_upload_link: let the person upload from their own devicemedia_upload_status: wait until that upload is readysearch_instagram_audio: music or sounds this Instagram account can put on a reel (accounts connected via Facebook)publish: publish or schedule the reel, only after the person approvesget_post: final status and permalinkget_help: the answer for an error code
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

