Skip to content
Conduit

skill

x-agent-skill

Eleven free Claude skills that run an X account, with a virality engine behind every idea: posts off 21 hook formulas, threads, replies, profile score, weekly plan, analytics audit and a humanizer. Fr

Jakeschincariol/x-agent-skillcommunitylistedunreviewed

Set up

Skills are installed by placing their folder where your agent loads skills.

The download comes from github.com/Jakeschincariol/x-agent-skill itself, not from our server, so what you get is exactly what its author published.

Install instructions come from the README

Skills do not use an MCP config. Follow the steps in the README below.

README

synced Oct 17, 2026

The X agent skill

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

They write your posts, comment on other people's threads, handle your replies, fix your profile and plan your week. And one of them is the virality skill: it finds the posts that are actually outperforming in your niche, breaks each one down into hook, structure and format, and recreates the winners in your voice, for your audience.

Under the skills are nine tools that actually run. One counts a post the way X counts it (links are 23, emoji are 2). One scores your first line before you post it. One cuts a draft into a thread that fits. One reads X's own published ranking code and tells you what it rewards this week. One reads your analytics export and tells you what worked, with the sample size on every claim.

Nothing is posted until you approve it. These skills write. You post.

Install

Paste this into Claude:

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

Install this skill, then confirm /x-post works.

Or do it yourself, in Claude Code:

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

Or as a plugin:

/plugin marketplace add Jakeschincariol/x-agent-skill
/plugin install x-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 Python tools, which is most of the point of /x-post, /x-viral and /x-human, but the rest works.

Then spend ten minutes on templates/voice.md. Copy it to ~/.claude/x/voice.md and fill it in, or paste five of your own posts into Claude and say "write my voice.md from these". Every skill reads that file. Skip it and everything comes out sounding like everyone else on the timeline.

The eleven

commandwhat it does
/x-postPost WriterOne idea into a post. Three hooks from 21 formulas, scored, one draft, counted the way X counts, humanized.
/x-commentComment DrafterReplies on other people's posts and threads. Nine types, picked by what the post is. Reply or quote, decided first.
/x-profileProfile OptimizerScores your profile against a 12-part rubric out of 100, then rewrites bio, pinned post and header in fix-first order.
/x-replyReply HandlerThe replies under your own posts, sorted into lead / substance / peer / question / support / noise, then answered in that order.
/x-planContent PlannerThe week: what to post, which format, when, and the 10 accounts to engage with.
/x-viralVirality EngineFinds what is outperforming in your niche, ranks it by multiple over each account's own median, breaks down hook, structure and format, recreates the top three for you.
/x-threadThread BuilderThread, long post or single post, decided first. Then post 1, one idea per post, cut to fit, and a last post people act on.
/x-humanHumanizerStrips em dashes, slop and invisible characters, then scores the draft on a five-check panel.
/x-repurposeRepurposerOne video, podcast, newsletter or LinkedIn post into a week of X posts and a thread.
/x-dmDM HandlerThe first message, two follow-ups, and triage for your inbox and message requests.
/x-auditAccount AuditReads your analytics export. Ranks by engagement, replies and shares per impression, not by impressions.

The nine tools

Every one runs on a clean Python 3 with no dependencies. Seven never touch the network. pull.py calls X's documented oEmbed API and weights.py reads a public GitHub file; neither needs an account or a key.

python3 skills/x-post/count.py post.txt                   # X's weighted count + six lints
python3 skills/x-post/hookscore.py hooks.txt              # score and rank first lines, name the formula
python3 skills/x-thread/thread.py draft.txt --number      # cut a draft into a thread that fits
python3 skills/x-human/humanize.py draft.txt --report     # strip the fingerprint
python3 skills/x-human/detect.py before.txt after.txt     # five-check panel, before and after
python3 skills/x-viral/pull.py urls.txt > swipe.tsv       # post URLs you picked -> text, format, date
python3 skills/x-viral/swipe.py swipe.tsv                 # outliers, broken down, as a swipe file
python3 skills/x-audit/audit.py analytics.csv             # what worked, with n on every claim
python3 skills/x-plan/weights.py                          # what X's ranker rewards, live from X's code

Counting the way X counts

X does not count characters. It counts weighted characters: every link is 23 however long it is, every emoji is 2 (a family emoji built from seven code points is still 2), Chinese, Japanese and Korean are 2, and "…" is 2, which is more than the three dots it replaces. count.py implements those rules, then draws the post the way the timeline shows it:

  WHAT FITS
  +------------------------------------------------------+
  | Most people use AI to post more. I used it to post   |
  | less.                                                |
  |                                                      |
  | In March I cut from 3 posts a day to 1. Followers    |
  | went from 2,100 to 6,800 by August.                  |
  |                                                      |
  | The system: one idea a day, drafted with Claude, cut |
  | in half by me, and I'm there for the first hour of   |
  | replies.                                             |
  |                                                      |
  | Showing up beats post                                |
  +------------------------------------ cut here, 4 over +

  FAIL  LENGTH      284 / 280, 4 over. X will not let you post it.
  PASS  FIRST LINE  56 characters, reads in one glance
  PASS  LINKS       none
  PASS  HASHTAGS    0
  PASS  MENTIONS    0
  PASS  ENDING      no reflex bait

With --premium the limit is 25,000 and the box shows where the timeline cuts a long post to "Show more", at about 280. It also flags an @mention past that point, because X does not notify it.

The hook

On X the first line is not the start of the post. It is most of the post. hookscore.py scores it on five properties (length, specificity, stakes, whether the payoff is up front, who it is aimed at), flags the dealbreakers, and names which of the 21 formulas it uses:

HOOK RANKING
==============================================================================
-> 100.0 STRONG  Nobody tells you your first 1,000 followers come from rep...
        #6 Nobody Tells You  ·  weakest: LENGTH (100)
    78.4 STRONG  I posted every day for 90 days. Here's what actually move...
        #2 Number Reveal  ·  weakest: FRONTLOAD (70)
    52.2 OK      The hottest new marketing hire is a skill file.
        #7 The Hottest New  ·  weakest: SPECIFICITY (15)
    36.2 WEAK    Hey guys, here are some thoughts on growing on X
        #21 The One-Liner  ·  weakest: STAKES (20)
        dealbreaker: Greeting. Nobody opened X to be greeted.
     4.8 WEAK    A thread 🧵
        #16 Thread Promise  ·  weakest: FRONTLOAD (0)
        dealbreaker: Opens on the word "thread". That is packaging. Put the
                     payoff in line 1 and let X's own UI say it is a thread.

Every formula in hooks.json carries a template, a filled example, what it is for, how it usually gets ruined, and a regex, so the same 21 names describe a hook you are writing and a hook you found in someone else's feed. That is what lets /x-viral say "the top third of your niche is The Hottest New and Field Report" instead of "posts that did well".

The virality engine

python3 skills/x-viral/pull.py urls.txt > swipe.tsv
# fill in the views column from the posts, they are public on every post
python3 skills/x-viral/swipe.py swipe.tsv --out ~/.claude/x/swipe.md

Raw numbers are not evidence. An account with 900,000 followers doing 400,000 views had an ordinary Tuesday; an account with 6,000 doing the same found something copyable. So swipe.py ranks on the outlier multiple, each post's views over its own account's median, computed from the 10 to 15 posts you collected per account. Accounts with too few posts are skipped instead of ranked on noise. Then each post gets broken down:

  • hook: which of the 21 formulas, and its score
  • structure: one line, one paragraph, short lines, a list, a long post, a thread
  • format: text, media, link, long

It compares the top third with the bottom third on all three, lists the hooks it could not classify (read those, they are where a new formula is hiding) and writes a swipe file with the reusable shape of each winner. /x-viral then recreates the top three in your voice: the found post's structure, none of its words.

What X rewards, from X

X open-sourced its current recommendation system in January 2026 and has published the production ranking weights in it since August. They move: two of them changed in the week this pack was written. So weights.py reads the file live and prints it with the date of its last change:

X FOR YOU RANKER  ·  action weights  ·  live from GitHub, last changed 2026-09-29 (commit a707cc2)
==============================================================================
REWARDED                                  weight   vs a like
  share by copying the link                     20     40.0x
  + added to a reply between mutuals            15     30.0x
  reply                                          5     10.0x
  share by DM                                    5     10.0x
  quote                                          5     10.0x
  follow the author                              4      8.0x
  share (any)                                    2      4.0x
  repost                                         1      2.0x
  like                                         0.5      1.0x
  ...
PUNISHED
  report                                      -234
  mute the author                            -58.8
  "not interested"                          -47.52
  block the author                           -31.2

Read it the way X's own comment in that file says to: each weight multiplies the predicted probability of an action for a given viewer, not a count of actions, so "a reply is worth ten likes" is the wrong conclusion. The right one is the direction. Write things people reply to, quote and send to one friend. Do not write the things people mute.

The humanizer

humanize.py strips invisible characters, fixes typography (em dash to comma, curly to straight) and replaces 176 stock words and phrases from slop.json, including an X block: "if you found this thread helpful", "RT if you agree", "let's dive in". It keeps the invisible characters that emoji need, so 👨‍💻 stays one emoji. Structural tells ("A thread 🧵" as the hook, "it's not just X, it's Y", a pile of hashtags) are flagged, not rewritten, because changing the shape of a sentence needs judgement.

detect.py scores five checks: burstiness, specificity, slop density, fingerprint, voice. A post of one or two sentences cannot show burstiness or a specificity density, so those sit out as n/a and the output says it scored on 3 of 5 rather than pretending.

A deliberately bad post, the automatic passes, then a rewrite by hand:

  HUMAN SCORE   #####...................  19.6   FLAGGED     the original
  HUMAN SCORE   ##########..............  42.9   FLAGGED     after humanize.py alone
  HUMAN SCORE   #####################...  85.7   PASS        after rewriting the flagged lines

The script gets you the first 23 points. The last 43 are the part it deliberately leaves to you.

The fine print, which is the honest part

These skills do not post, reply, like, follow or DM. X's API does allow posting with your own developer app and OAuth, unlike LinkedIn's. As of September 2026 it is pay-per-use: $0.015 a post, $0.20 for a post with a link, credits bought upfront (pricing). It is still not built here, on purpose. X's automation rules prohibit automated likes, bulk follows and unsolicited automated replies, and AI reply bots need X's written approval, and replies and comments are most of what this pack writes. So every skill ends the same way: a copy-ready block, and you paste it.

/x-viral reads, it does not scrape. X's Terms prohibit crawling or scraping "in any form, for any purpose" without written consent. You pick the posts; pull.py only fetches URLs you give it, through the documented oEmbed API, one per second, capped at 100 a run. It never logs in, never uses your session and never fetches counts. You read those off the screen.

hookscore.py is a lint, not a predictor. The same five-property panel, tested on 74 real short-form hooks in the Instagram version of this pack, separated real hooks from deliberately bad ones well (AUC 0.83) and a creator's own hits from their own misses barely at all (AUC 0.56, a coin flip is 0.50). It has not been re-calibrated on X. It catches labels, greetings and hooks with nothing concrete in them. It will not tell you which of two decent hooks will travel. /x-audit on your own posts will.

The link question is left to your data. X says it stopped down-ranking posts with links more than a year ago (Musk and Nikita Bier, July 2026). An independent analysis in January 2026 still measured fewer views on them. The pack does not pick a side. /x-audit splits your posts by format and tells you which is true for your account.

The five detection checks are local heuristics, not GPTZero, Originality, Copyleaks, Winston or Turnitin. They do not call those services and cannot promise their verdicts. Nobody can honestly sell you "undetectable".

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.

Files

skills/x-post/hooks.json         21 hook formulas: template, example, use, trap, match regex
skills/x-post/hookscore.py       five-property hook panel + formula classifier
skills/x-post/count.py           X's weighted character count + six lints
skills/x-thread/thread.py        draft -> thread that fits, five thread lints
skills/x-viral/pull.py           post URLs -> swipe sheet, via X's oEmbed API
skills/x-viral/swipe.py          outlier ranking + hook / structure / format breakdown
skills/x-audit/audit.py          analytics export -> what worked, with n
skills/x-plan/weights.py         X's published ranking weights, live
skills/x-human/slop.json         176 terms, 18 invisible classes, 18 structural tells
skills/x-human/humanize.py       the three cleaning passes
skills/x-human/detect.py         the five-check panel
skills/x-profile/rubric.json     the 100-point profile score
templates/voice.md               your voice profile. Fill this in first.

Your own files live in ~/.claude/x/: voice.md, plan.md, log.md and swipe.md. The skills read each other's.

Credit

Made by Jake Schincariol, opusjake.ai. Siblings: LinkedIn, Instagram, YouTube.

License

MIT. Take it, change it, ship it.

↑↓ navigate openesc close