X thread builder
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).
How to use it
- Hit Copy the whole skill.
- Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
ChatGPT: make a Project and paste it into Instructions.
Neither? Paste it at the top of a new chat — it works for that chat. - Describe your job in plain words. The AI follows the skill from there.
npx degit sergebulaev/x-skills/.codex-marketplace/x-skills/skills/x-thread-builder#main ~/.claude/skills/x-thread-builderFor one project only, change the path to .claude/skills/x-thread-builder.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Show the full text128 lines
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.
When to use
- User says "turn this into a thread" or "write me a thread about X"
- The idea is a list where each item needs teaching, a story with a build, a surprising result with a mechanism, or a repeatable process
- User has a single tweet that is trying to do too much and should be a thread
Formulas this skill uses (thread shapes)
| 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.
Pick by goal first
| Goal | Reach for |
|---|---|
| Bookmarks | X7, X10, X9 |
| Likes | X8 |
| Reposts | X8 |
| Replies | X9 |
How Publora splits a thread
Pass the full thread as one content string. Publora auto-splits it:
- at paragraph breaks (
\n\n) first, - then at sentence endings,
- then at word boundaries as a fallback,
- and adds
(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.
Steps
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.
- Gather inputs. Topic, the raw material (notes, a transcript, a result), target audience, and the goal (bookmarks / likes / reposts / replies).
- Pick the formula from the goal table, confirm it fits the material.
- Write tweet 1. This is 80% of the work:
- Promise a specific payoff (a number, a named result, a clear list count).
- Open a loop the reader has to resolve ("most people get 3 of them wrong", "I did not expect why").
- Keep it under 280 chars on a standard account. It must stop the scroll alone.
- Pace the body. One beat or one item per tweet. Front-load the strongest 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.
- Make each tweet stand alone. A reader landing mid-thread from a quote tweet should still get something.
- Write the closer. The last tweet earns the repost and the follow. End on the most quotable line, then one clear ask (bookmark, follow, or "reply with yours"), not both.
- Humanizer pass on every tweet. Scrub 2026 AI vocab by density, cap em
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-humanizerV3. - Optional audit. Run
x-humanizer --mode auditon the assembled thread. - Approval card. Show the thread tweet-by-tweet with per-tweet char counts,
total tweet count, the formula, and the goal. Confirm any
---breaks. - 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 apostGroupId.
Hard rules
Global voice rules: see root SKILL.md Voice rules. Additional skill-specific
rules:
- Tweet 1 must contain a real promise and an open loop. A bare "A thread:" label is not a hook.
- Keep each tweet under 280 chars on a standard account (emoji = 2 chars).
- Front-load value. Never bury the best item at the end of a teaching thread.
- No external link in tweet 1. Put links in a later tweet or a reply.
- Natural rhythm, not manufactured variance. A long thread where every tweet 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.
- Only ship a Story Thread (X8) built on a true story. Readers punish manufactured stakes.
Anti-patterns (skill will refuse)
- Tweet 1 that closes its own loop (no reason to expand).
- Over-promising in tweet 1 and under-delivering in the body.
- Vague how-to steps ("be consistent", "add value") in an X10 teardown.
- Padding to hit a round number of tweets.
- Em dashes above the cap (more than one in a tweet), AI vocab clusters, ALL CAPS openers.
- "The result?" reveals, "No X. No Y. Just Z." staccato stacks, one-word tweets for drama.
- Announced candor ("Let me be honest", "not gonna lie") with no dated fact behind it.
- Engagement-bait closers ("RT if this helped").
Resources
../../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 playbook
Related skills
x-post-writer- when the idea is really just one tweetx-humanizer- scrub each tweet, or--mode auditthe whole threadx-hook-extractor- lift the structure from a viral thread you admirex-content-planner- schedule threads into a weekly cadence
| 1 | |
| 2 | name x-thread-builder |
| 3 | description "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)." |
| 4 | |
| 5 | |
| 6 | # X Thread Builder |
| 7 | |
| 8 | Build tweetstorms that get read all the way down. On X, tweet 1 is the entire |
| 9 | funnel: it has to promise a payoff and open a loop, or no one taps "Show this |
| 10 | thread." Everything after only matters if tweet 1 earns the tap. |
| 11 | |
| 12 | ## When to use |
| 13 | |
| 14 | User says "turn this into a thread" or "write me a thread about X" |
| 15 | The idea is a list where each item needs teaching, a story with a build, a |
| 16 | surprising result with a mechanism, or a repeatable process |
| 17 | User has a single tweet that is trying to do too much and should be a thread |
| 18 | |
| 19 | ## Formulas this skill uses (thread shapes) |
| 20 | |
| 21 | | Code | Formula | Primary goal | Best for | |
| 22 | |---|---|---|---| |
| 23 | | X7 | Listicle-Thread Promise | bookmarks | numbered teaching thread, one item per tweet | |
| 24 | | X8 | Story Thread | likes, reposts | a real narrative with a build and a turn | |
| 25 | | X9 | Curiosity-Gap Opener | replies, bookmarks | a surprising result, mechanism withheld | |
| 26 | | X10 | How-I Teardown | bookmarks | a repeatable process you ran yourself | |
| 27 | |
| 28 | Full skeletons in `../../references/hook-formulas.md`. For single tweets |
| 29 | (X1-X6), use `x-post-writer`. |
| 30 | |
| 31 | ### Pick by goal first |
| 32 | |
| 33 | | Goal | Reach for | |
| 34 | |---|---| |
| 35 | | Bookmarks | X7, X10, X9 | |
| 36 | | Likes | X8 | |
| 37 | | Reposts | X8 | |
| 38 | | Replies | X9 | |
| 39 | |
| 40 | ## How Publora splits a thread |
| 41 | |
| 42 | Pass the full thread as one `content` string. Publora auto-splits it: |
| 43 | |
| 44 | at paragraph breaks (`\n\n`) first, |
| 45 | then at sentence endings, |
| 46 | then at word boundaries as a fallback, |
| 47 | and adds `(1/N)` markers, reserving ~8 chars per tweet for the marker. |
| 48 | |
| 49 | For full control of where each tweet breaks, hand-split with a `---` separator |
| 50 | on its own line between tweets. The skill defaults to hand-splitting with `---` |
| 51 | so the user sees exactly how the thread will land before approving. |
| 52 | |
| 53 | ## Steps |
| 54 | |
| 55 | **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. |
| 56 | |
| 57 | **Gather inputs.** Topic, the raw material (notes, a transcript, a result), |
| 58 | target audience, and the goal (bookmarks / likes / reposts / replies). |
| 59 | **Pick the formula** from the goal table, confirm it fits the material. |
| 60 | **Write tweet 1.** This is 80% of the work: |
| 61 | Promise a specific payoff (a number, a named result, a clear list count). |
| 62 | Open a loop the reader has to resolve ("most people get 3 of them wrong", |
| 63 | "I did not expect why"). |
| 64 | Keep it under 280 chars on a standard account. It must stop the scroll |
| 65 | alone. |
| 66 | **Pace the body.** One beat or one item per tweet. Front-load the strongest |
| 67 | item or beat at position 1-2; tap-through decays with depth. Target 5-9 |
| 68 | tweets for teaching/list threads; longer only for a strong story. |
| 69 | **Make each tweet stand alone.** A reader landing mid-thread from a quote |
| 70 | tweet should still get something. |
| 71 | **Write the closer.** The last tweet earns the repost and the follow. End on |
| 72 | the most quotable line, then one clear ask (bookmark, follow, or "reply with |
| 73 | yours"), not both. |
| 74 | **Humanizer pass** on every tweet. Scrub 2026 AI vocab by density, cap em |
| 75 | dashes (at most one per tweet, never swap one for a period), break stacked |
| 76 | triads and reveal bridges. Let tweet length vary only as the material |
| 77 | varies: never insert a 3-word punch tweet for rhythm, never alternate |
| 78 | long/short, and touch rhythm only if the whole thread reads machine-flat. |
| 79 | Canonical rules: `x-humanizer` V3. |
| 80 | **Optional audit.** Run `x-humanizer --mode audit` on the assembled thread. |
| 81 | **Approval card.** Show the thread tweet-by-tweet with per-tweet char counts, |
| 82 | total tweet count, the formula, and the goal. Confirm any `---` breaks. |
| 83 | **On approval.** Call `lib.publish(kind="thread", draft_text=<full thread |
| 84 | with --- breaks>, target_url="https://x.com/compose/tweet", |
| 85 | platforms=[<X_PLATFORM_ID>], scheduled_time=<iso_or_None>)`. Publora posts |
| 86 | the chain in one call and returns a `postGroupId`. |
| 87 | |
| 88 | ## Hard rules |
| 89 | |
| 90 | Global voice rules: see root `SKILL.md` Voice rules. Additional skill-specific |
| 91 | rules: |
| 92 | |
| 93 | Tweet 1 must contain a real promise and an open loop. A bare "A thread:" label |
| 94 | is not a hook. |
| 95 | Keep each tweet under 280 chars on a standard account (emoji = 2 chars). |
| 96 | Front-load value. Never bury the best item at the end of a teaching thread. |
| 97 | No external link in tweet 1. Put links in a later tweet or a reply. |
| 98 | Natural rhythm, not manufactured variance. A long thread where every tweet |
| 99 | is the same length and none carries a real clause reads machine-flat; fix |
| 100 | that one thing. Never pad or chop tweets to create variance, and never |
| 101 | insert a punch tweet: the inserted punch is the humanizer fingerprint. |
| 102 | Only ship a Story Thread (X8) built on a true story. Readers punish |
| 103 | manufactured stakes. |
| 104 | |
| 105 | ## Anti-patterns (skill will refuse) |
| 106 | |
| 107 | Tweet 1 that closes its own loop (no reason to expand). |
| 108 | Over-promising in tweet 1 and under-delivering in the body. |
| 109 | Vague how-to steps ("be consistent", "add value") in an X10 teardown. |
| 110 | Padding to hit a round number of tweets. |
| 111 | Em dashes above the cap (more than one in a tweet), AI vocab clusters, ALL CAPS openers. |
| 112 | "The result?" reveals, "No X. No Y. Just Z." staccato stacks, one-word tweets for drama. |
| 113 | Announced candor ("Let me be honest", "not gonna lie") with no dated fact behind it. |
| 114 | Engagement-bait closers ("RT if this helped"). |
| 115 | |
| 116 | ## Resources |
| 117 | |
| 118 | `../../references/hook-formulas.md` - X7-X10 thread skeletons with worked shapes |
| 119 | `../../references/algorithm-heuristics.md` - thread length, tap-through decay, signals |
| 120 | `references/thread-structure.md` - per-position pacing and the closer playbook |
| 121 | |
| 122 | ## Related skills |
| 123 | |
| 124 | `x-post-writer` - when the idea is really just one tweet |
| 125 | `x-humanizer` - scrub each tweet, or `--mode audit` the whole thread |
| 126 | `x-hook-extractor` - lift the structure from a viral thread you admire |
| 127 | `x-content-planner` - schedule threads into a weekly cadence |
| 128 |