Back to the journal

The Instagram Agent Skill humanizer deletes the Persian ZWNJ, and your emoji joiners

Instagram Agent Skill is thirteen free, MIT-licensed Claude skills with no signup and no API key. Its humanizer also deletes ZWNJ, ZWJ and direction marks, and detect.py scores correctly written Persian as more machine-like. Read this before you install it.

Instagram Agent Skill is being shared a lot: thirteen Claude skills that run the writing side of an Instagram account. Its README says free, MIT, no signup, no API key, nothing to connect. We read the repository at commit d03c56b (13 September 2026). Those claims hold. One skill in it breaks Persian text.

What is actually in the repository

  • Thirteen folders under skills/, from ig-reel and ig-caption to ig-dm and ig-audit. Three install routes: paste the link into Claude, copy the folders into ~/.claude/skills/, or add it as a plugin. (README)
  • The five Python scripts import only the standard library. None of them uses requests, urllib or a socket.
  • It posts nothing. The README says so plainly: the skills write and you post, because browser automation breaks Instagram's terms. "Content manager" here means a drafting assistant, not an account operator.
  • The author tested the hook scorer and published the uncomfortable half. It catches deliberately bad hooks well (AUC 0.83). It is close to a coin flip at telling one creator's hits from their misses (AUC 0.56). The corpus is English YouTube Shorts, not Reels.

What we hit

ig-human is the humanizer, which the README calls the reason the rest are usable. Its list of "invisible" characters is in slop.json. Line 11 is U+200C, ZERO WIDTH NON-JOINER, with "action": "delete". The same list deletes ZWJ (U+200D), LRM, RLM and ARABIC LETTER MARK (U+061C).

Removing an entry from the list does not save it. humanize.py, lines 88–92, then deletes every remaining character in Unicode category Cf, and ZWNJ is one of them. In Persian, ZWNJ is how a word keeps its parts apart without a space. «می‌خواهم» becomes «میخواهم», and «کتاب‌ها» becomes «کتابها».

detect.py counts every Cf character on line 108 and weights each by 4 on line 113. Correctly written Persian therefore gets a worse FINGERPRINT score and reads as more machine-made.

ZWJ is everyone's problem. Combined emoji such as 👨‍👩‍👧 are held together by it, and deleting it splits them into separate emoji. That happens in captions.

We did not run the scripts. Everything above comes from reading the source, and the lines are linked.

What to do

Do not run humanize.py on Persian or Arabic text. To run it anyway, remove those five entries from the invisible array in slop.json and narrow the Cf pass:

# Persian and Arabic need these; ZWJ also holds emoji sequences together
KEEP = {chr(c) for c in (0x200C, 0x200D, 0x200E, 0x200F, 0x061C)}

stray = [c for c in text if unicodedata.category(c) == "Cf" and c not in KEEP]
text = "".join(c for c in text if unicodedata.category(c) != "Cf" or c in KEEP)

detect.py:108 needs the same exemption, or the score still penalises them.

Sources

Drafted with AI, reviewed by Emad Habibnia