x-post
/x-post
Zamienia jeden surowy pomysł w post na X: trzy haczyki, jeden szkic po humanizacji i liczenie znaków, bez publikowania.
- Autor
- muhammadhassan03 ↗
- Repozytorium
- x-agent-skill ↗
- Licencja
- MIT
- Ostatnia zmiana repozytorium
- 24.10.2026
Ocena i bezpieczeństwo
- Pliki w paczce
- 4
- Skrypty
- 2
- Komentarze HTML
- 0
- Adresy URL w SKILL.md
- 1
Brak sygnałów. Repozytorium zmienione 24.10.2026, bez odwołań do wycofanych modeli i API.
MIT, otwarta: można używać i zmieniać, z zachowaniem informacji o autorze.
- 2 skrypty w paczce. Przejrzyj je przed instalacją, bo Claude może je uruchomić.
Skrypty: postscore.py, xcount.py
Co robi i kiedy
Zamienia jeden surowy pomysł w post na X: trzy haczyki, jeden szkic po humanizacji i liczenie znaków, bez publikowania.
Wyzwalacze z opisu
Oryginalny opis (EN)
Turn one raw idea into an X post: three hooks off 19 formulas, scored offline, one humanized draft counted in weighted characters, ready to copy and post by hand. Use when the user says "write a post about X", "tweet this", "give me a hook", "turn this into a post", or has an idea and no first line. Free account by default (280 weighted characters, link in the first reply). Never posts.
Jak działa
- Before you write
- The loop
- Rules that matter
- Fine print
- Without the tools
- Approval gate
Podgląd SKILL.md
---
name: x-post
description: >-
Turn one raw idea into an X post: three hooks off 19 formulas, scored offline,
one humanized draft counted in weighted characters, ready to copy and post by
hand. Use when the user says "write a post about X", "tweet this", "give me a
hook", "turn this into a post", or has an idea and no first line. Free account
by default (280 weighted characters, link in the first reply). Never posts.
---
# x-post
One idea in, one post out. Two tools live beside this file and both run. Use
them; do not eyeball the hook or the length. Run them from this skill's folder.
```bash
python3 xcount.py draft.txt # weighted length, the way X counts
python3 postscore.py draft.txt # hook, specificity, reply pull, link, bait
python3 postscore.py --hooks hooks.txt # rank three candidate first lines
python3 postscore.py draft.txt --split-link # POST and FIRST REPLY blocks, link moved out
```
On Windows, where this says `python3`, use `python` (`python3` there is usually the Microsoft Store
shortcut and fails with "Python was not found"; try `py` if `python` is also missing).
## Before you write
1. Read `~/.claude/x/voice.md` (or `~/.claude/x/<handle>/voice.md`). If it does
not exist, ask for three of the user's own posts, infer the voice, and write
the file from `templates/voice.md`. If that template is not on disk (a by-hand
install copies only `skills/`), write the file with these headings: Who I am on
X (handle, what I do, who I write for, free or Premium, where the money comes
from), How I sound (sentence length, contractions, slang, capitalisation),
Things I never say, Proof I can use (only facts the user gave), Off-platform
path (the one link), Never (invent a number, ask for likes).
2. Default persona: a small account on the free tier, earning off-platform
through clients, a product or a newsletter. 280 weighted characters. Do not
assume Premium. Premium features are documented in `references/x-rules.md`,
not tested by the author.
3. If the idea is thin, ask one batched question: what happened, to whom, what
did it cost or return. A post needs one specific true thing.
4. **Never invent a number.** If the draft needs a figure the user did not give,
write `{{your number}}` and say so. `postscore.py` blocks any draft that still
contains a `{{...}}`.
## The loop
1. **Three hooks, not one.** Choose three formulas from `hooks.json` that fit the
idea. Different formulas, not three rewrites. Put the first lines in a file.
2. **Score them.** `python3 postscore.py --hooks hooks.txt`. Show the ranking.
If the best is under 50, you do not have the hook yet. Get a better fact from
the user instead of editing.
3. **Write the draft** on the winning hook. One idea. Plain words. Fits 280
weighted characters. A link in the root post is a hard stop on a free account:
`postscore.py` caps the score at 49 and blocks the draft.
4. **Count and score it:** `xcount.py` then `postscore.py`. Fix every flag.
5. **Humanize it:** run `/x-human` before showing anything.
6. **Print the post block.** When the draft had a link, ALWAYS print a second block
titled FIRST REPLY containing the link, and nothing else. `--split-link` prints both.
Real output (sample draft, free account):
```
POST SCORE 93.8 STRONG (203/280 weighted)
----------------------------------------------------------------
HOOK ###################. 95.0 61 weighted characters
SPECIFICITY #################### 100.0 9 concrete markers in 42 words
REPLY PULL ###############..... 75.0 question present
LINK #################### 100.0 no link in body
BAIT #################### 100.0 none
```
A draft with a link in the root post is capped and blocked (real output):
```
POST SCORE 49.0 WEAK (141/280 weighted)
score capped at 49: link in root post
----------------------------------------------------------------
HOOK ###################. 95.0 52 weighted characters
...
BLOCKING: Link in root post. On free accounts, links in the root post were observed to cost reach (observed, not coded). Put it in the first reply.
```
The fix is to move the link out. `--split-link` prints the two blocks to hand to the user:
```
POST (link removed)
I sent 400 cold DMs in 30 days and 2 became clients.
What is the first line you send to a stranger?
FIRST REPLY
Full breakdown:
https://example.com/dm-breakdown
```
A weak draft looks like this, and `postscore.py` exits non-zero on it:
```
POST SCORE 37.1 WEAK (161/280 weighted)
BAIT .................... 0.0 like/repost solicitation, "RT/like if" bait, "follow for more"
- engagement bait ... This is also an Original Content Rewards ineligibility problem
BLOCKING: engagement bait; hashtag wall (more than 2)
```
## Rules that matter
- **Link in the first reply, never the root post.** On a free account a link in the
root post is a hard stop (score capped at 49, draft blocked). Label it honestly:
*observed, not coded*. The open-sourced ranking parameters contain no link penalty. Reach loss
on link posts from non-Premium accounts was observed in March 2025 (Buffer,
18.8M posts). It is a measurement from outside, not a coded rule.
- **ALLOW_LINK.** If the user has a reason to keep a link in the root post (say so out loud: it
is the one thing the scorer will not let through by default), run `postscore.py draft.txt
--allow-link`. The hard stop becomes the old warning, the score is not capped, and the other
checks still apply. Never use it on your own initiative.
- **No bait.** "Like and repost if", "follow for more", "bookmark this" are ranking
risks and Original Content Rewards ineligibility problems. Cut them.
- **At most one hashtag.** Zero is normal.
- **The first line works alone.** No "A thread", no "Here's why", no "Let me explain".
- **Replies are cheap to earn with a real question.** End on something answerable
in one line. "Thoughts?" is not that.
- **Weights scale predicted probabilities, not raw counts.** Never repeat the
"one report cancels 468 likes" line. See `references/x-algorithm.md`.
## Fine print
`postscore.py` is five local heuristics. It does not know how a post will do.
Measured on a public tweet corpus, its score did not predict which tweets beat
their account's median likes (AUC 0.45 to 0.50). Treat the number as a lint
result, never as a forecast, and say so if the user reads it as one. It never says a post is "undetectable"
or "will go viral".
## Without the tools
If you cannot run the Python tools (for example you pasted only this file), do the checks by hand and
say so. Count weighted characters yourself: 280 on a free account, a URL counts 23, CJK characters and
most emoji count 2. Then check: the first line works alone; there is a specific number or event the
user gave; no "like and repost if" or "follow for more"; no unfilled `{{placeholder}}`; at most one
hashtag; the link is in a separate first-reply block. Tell the user the score was not run.
## Approval gate
1. Show the finished text in one fenced block, ready to copy. If there is a link,
show it in a second block titled FIRST REPLY.
2. End the message with: Reply yes to log it.
3. On "yes", append one line to `~/.claude/x/log.md` (or the handle's folder):
date, skill, first line. That is all "yes" does.
4. Never post, like, follow, reply, DM or scroll. You write; the human posts, by
hand, on x.com.
Pliki w paczce (4)
- SKILL.md 7 KB
- hooks.json 8 KB
- postscore.py 17 KB
- xcount.py 7 KB
Wersje
| Repozytorium | Wynik | Licencja |
|---|---|---|
| Ta strona · muhammadhassan03/x-agent-skill | 100 | MIT |
| mickpletcher/AI-Skills | 100 | MIT |
| mickpletcher/AI-Skills | 100 | MIT |
| publora/skills | 100 | MIT |
| mickpletcher/AI-Skills | 100 | MIT |
| mayank-io/mstack | 100 | MIT |
| kiyeonjeon21/reframe | 100 | MIT |
Migawka bazy z 28.10.2026 · wersja paczki dd2f1c6e7f27 (skrót SHA-256 całej paczki)
Pobrania w ostatnich 30 dniach: 0 · ranking
Zgłoś problem z tym skillem: szkodliwa treść, błędny opis albo prośba autora o usunięcie.
Podobne skille
- 100li-post
Pisze post na LinkedIn z surowego pomysłu według 21 sprawdzonych formuł haczyka, w głosie autora i bez śladów AI, z trzema haczykami i jednym pełnym szkicem. - 100x-thread
Dzieli długi szkic na wątek na X, przenosząc linki na koniec, i sprawdza jakość pierwszego posta. - 100tweet-thread-builder
Zamienia jeden pomysł w zwarty wątek na X: hak, jedna myśl na wpis i prowadzenie do jednego wezwania do działania. - 90content-start
Zamienia jeden pomysł w tydzień treści: sprawdza, czy system zna głos autora, i kieruje dalej do właściwego formatu. - 90x-plan
Układa tydzień na X: co publikować, w jakim formacie i o której godzinie oraz dziesięć kont do odpowiedzi, bez publikowania. - 100blog-post-writer
Zamienia surowy materiał Nicka Nisiego w szkic wpisu blogowego jego głosem: celowo płaski szkic z faktami ze źródeł i oznaczonymi lukami.