Build a long-form X (Twitter) thread (tweetstorm) using a 2026 thread formula (listicle-thread, story thread, curiosity-gap opener, how-I teardown), picked by goal (bookmarks, likes, reposts, replies). Structures tweet 1 as a promise plus open loop, paces one beat per tweet, and closes for the repost. Publishes via Publora, which auto-splits long content into a numbered (1/N) thread. Not for single tweets (use x-post-writer) or auditing a draft (use x-humanizer --mode audit).
npx skills add https://github.com/sergebulaev/x-skills --skill x-thread-builder
Build tweetstorms that get read all the way down. On X, tweet 1 is the entire
funnel: it has to promise a payoff and open a loop, or no one taps "Show this
thread." Everything after only matters if tweet 1 earns the tap.
surprising result with a mechanism, or a repeatable process
| Code | Formula | Primary goal | Best for |
|---|---|---|---|
| X7 | Listicle-Thread Promise | bookmarks | numbered teaching thread, one item per tweet |
| X8 | Story Thread | likes, reposts | a real narrative with a build and a turn |
| X9 | Curiosity-Gap Opener | replies, bookmarks | a surprising result, mechanism withheld |
| X10 | How-I Teardown | bookmarks | a repeatable process you ran yourself |
Full skeletons in ../../references/hook-formulas.md. For single tweets
(X1-X6), use x-post-writer.
| Goal | Reach for |
|---|---|
| Bookmarks | X7, X10, X9 |
| Likes | X8 |
| Reposts | X8 |
| Replies | X9 |
Pass the full thread as one content string. Publora auto-splits it:
\n\n) first,(1/N) markers, reserving ~8 chars per tweet for the marker.For full control of where each tweet breaks, hand-split with a --- separator
on its own line between tweets. The skill defaults to hand-splitting with ---
so the user sees exactly how the thread will land before approving.
Voice profile first (all drafts). If ../../references/voice-profile.md has filled: yes, load it and match the user's voice fingerprint, hard rules, and CTA/link style throughout. If it is not filled, mention once that x-humanizer --mode profile can learn their voice from a few posts, then proceed with the generic voice rules.
target audience, and the goal (bookmarks / likes / reposts / replies).
"I did not expect why").
alone.
item or beat at position 1-2; tap-through decays with depth. Target 5-9
tweets for teaching/list threads; longer only for a strong story.
tweet should still get something.
the most quotable line, then one clear ask (bookmark, follow, or "reply with
yours"), not both.
dashes (at most one per tweet, never swap one for a period), break stacked
triads and reveal bridges. Let tweet length vary only as the material
varies: never insert a 3-word punch tweet for rhythm, never alternate
long/short, and touch rhythm only if the whole thread reads machine-flat.
Canonical rules: x-humanizer V3.
x-humanizer --mode audit on the assembled thread.total tweet count, the formula, and the goal. Confirm any --- breaks.
10. On approval. Call `lib.publish(kind="thread", draft_text=<full thread
with --- breaks>, target_url="https://x.com/compose/tweet",
platforms=[<X_PLATFORM_ID>], scheduled_time=<iso_or_None>)`. Publora posts
the chain in one call and returns a postGroupId.
Global voice rules: see root SKILL.md Voice rules. Additional skill-specific
rules:
is not a hook.
is the same length and none carries a real clause reads machine-flat; fix
that one thing. Never pad or chop tweets to create variance, and never
insert a punch tweet: the inserted punch is the humanizer fingerprint.
manufactured stakes.
../../references/hook-formulas.md - X7-X10 thread skeletons with worked shapes../../references/algorithm-heuristics.md - thread length, tap-through decay, signalsreferences/thread-structure.md - per-position pacing and the closer playbookx-post-writer - when the idea is really just one tweetx-humanizer - scrub each tweet, or --mode audit the whole threadx-hook-extractor - lift the structure from a viral thread you admirex-content-planner - schedule threads into a weekly cadenceTake sergebulaev/x-thread-builder from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.