@orbitant/brain-marketing 1.5.1 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +2 -2
- package/manifest.json +28 -1
- package/package.json +1 -1
- package/skills/x-thread/SKILL.md +269 -0
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Marketing team skills for content creation and review.
|
|
4
4
|
|
|
5
|
-
**v1.
|
|
5
|
+
**v1.6.0** · vertical `marketing` · 9 skills
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
@@ -36,7 +36,7 @@ Named imports work too: `import { skills, meta } from '@orbitant/brain-marketing
|
|
|
36
36
|
|
|
37
37
|
## Keys
|
|
38
38
|
|
|
39
|
-
- **skills** — `orbitant-blog-post-create`, `orbitant-blog-post-review`, `orbitant-blog-post-translate`, `orbitant-image-creation`, `orbitant-linkedin-post`, `orbitant-newsletter`, `orbitant-tone`, `orbitant-yt-description`
|
|
39
|
+
- **skills** — `orbitant-blog-post-create`, `orbitant-blog-post-review`, `orbitant-blog-post-translate`, `orbitant-image-creation`, `orbitant-linkedin-post`, `orbitant-newsletter`, `orbitant-tone`, `orbitant-x-thread`, `orbitant-yt-description`
|
|
40
40
|
|
|
41
41
|
## Versioning
|
|
42
42
|
|
package/manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"meta": {
|
|
3
3
|
"name": "orbitant-marketing",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.6.0",
|
|
5
5
|
"vertical": "marketing"
|
|
6
6
|
},
|
|
7
7
|
"skills": [
|
|
@@ -191,6 +191,33 @@
|
|
|
191
191
|
},
|
|
192
192
|
"relDir": "skills/tone"
|
|
193
193
|
},
|
|
194
|
+
{
|
|
195
|
+
"name": "orbitant-x-thread",
|
|
196
|
+
"folder": "x-thread",
|
|
197
|
+
"description": "X (Twitter) thread writer for Orbitant. Turns a published blog post OR native\nmaterial — a Knowledge Sharing transcript, a Slack thread, a feature just\nshipped, a build-in-public moment — into a thread ready to post: an opening\npost that stands alone, body posts of one idea each, and a closing post,\nevery one annotated with its character count against X's 280 limit.\n\nActivate when the user asks for a thread, an X post or a Twitter post, or says\n\"haz un hilo\", \"convierte esto en un hilo\", \"esto da para un hilo\", \"thread\nthis\", \"algo para X\", \"para Twitter\". Also trigger when the user shares a blog\npost, a transcript or a Slack conversation and asks for social copy while\nmentioning X, Twitter, threads or @WeOrbitant — even if they never say the\nword \"thread\". This skill writes for X only; it is the wrong skill for\nLinkedIn, YouTube or the newsletter.",
|
|
198
|
+
"version": "1.0.0",
|
|
199
|
+
"tags": [
|
|
200
|
+
"marketing",
|
|
201
|
+
"x",
|
|
202
|
+
"twitter",
|
|
203
|
+
"thread",
|
|
204
|
+
"social-media",
|
|
205
|
+
"content",
|
|
206
|
+
"engagement"
|
|
207
|
+
],
|
|
208
|
+
"content": "\n# Orbitant X Thread Skill\n\nA thread is one argument spread across several posts. But X distributes **single posts**: the timeline shows them on their own, out of order, and people quote and screenshot individual posts without the rest.\n\nSo a thread has two jobs at once. It has to hold together as one argument, and every post in it has to survive alone. Every rule below follows from that.\n\n---\n\n## What X imposes\n\nPlatform facts. They are not style preferences and you cannot write around them.\n\n- **280 characters per post, hard.** A post at 281 does not post. Count every one.\n- **No text formatting.** X renders no markdown. `**bold**` shows up as literal asterisks, `##` as literal hashes. The line break is the only formatting tool you have.\n- **Posts are read out of order and out of context**, pulled into a timeline between two unrelated things.\n- **Links cost reach.** A link in the opening post suppresses distribution. One link per thread, in the closing post.\n- **Hashtags do nothing.** See the Hashtags section.\n- **Code does not survive as text.** No monospace, and indentation is stripped. Code has to be an image.\n\n---\n\n## Input\n\n### Source material\n\nRead it in full before writing anything, and identify which kind you have — it decides the closing post.\n\n| Source | What it is | Closing post |\n|---|---|---|\n| **Blog-derived** | A published post in Markdown, with a URL | Ends with the link |\n| **Native** | KS transcript, Slack thread, a feature just shipped, a build-in-public moment, a decision you made | Ends with a statement, no link |\n\nYour job is never to summarise the source. It is to find the one argument inside it that earns a thread.\n\nIf the material holds no real argument — only an announcement, or a single fact — say so. A thread is the wrong format for it, and one good post beats a padded thread.\n\n### Account and voice\n\nAsk which account posts if it is not stated and the answer would change the copy. Default to the company account.\n\n| Account | Pronoun | Self-mention | Sign-off |\n|---|---|---|---|\n| **Company** (`@WeOrbitant`) | \"we\" | Never — the account *is* Orbitant | None |\n| **Personal** (a team member) | \"I\" | One `@WeOrbitant` mention, in the closing post | The lived experience is the sign-off |\n\nOn a personal account the thread must read as something that person actually did, decided or measured — first person singular. Do not write a company announcement and paste a name on it.\n\n### Language\n\n**Follow the language of the source.** Spanish material, Spanish thread. English material, English thread. One version — never both, and never a translation alongside.\n\nIf the source mixes languages, use the language of the bulk of it. Keep technical English terms in English even in a Spanish thread: *framework*, *pipeline*, *deployment*, *token*.\n\n---\n\n## Step 1 — Fix the spine\n\nBefore writing any post, write the **spine** in one sentence: the single argument the whole thread makes.\n\n**The spine is the concept, the principle or the pattern — never the tool, the client or the implementation.** If the source uses a real project, a framework or a specific stack to illustrate the point, those are evidence. They are never the subject.\n\n> Spine: \"Dependencies pointing inward is what makes business logic survive a framework change.\"\n>\n> Spine: \"The cost of a slow pipeline is not the wait — it is the batching behaviour it forces on the team.\"\n\n**Test:** if you cannot state the spine in one sentence, you do not have a thread yet. You have two threads, or a blog post.\n\n---\n\n## Step 2 — The opening post\n\nX surfaces this post on its own. Assume most people read only this one. **It has to deliver value standing alone** — someone who never opens the thread should still walk away with something.\n\n### Rules\n\n- **A statement, never a rhetorical question.** A question invites \"no\" and a scroll.\n- **No link.** It goes in the closing post, once.\n- **No thread announcement.** No \"🧵\", no \"A thread:\", no \"👇\", no \"Let me explain:\". A post that has to announce it is a thread is not a hook.\n- **Target ~200 of the 280 characters.** Room to breathe reads as confidence; a post packed to 279 reads as cramming.\n- **Do not open with \"We\", \"Our\" or \"Orbitant\".** Open with the insight. Exception: featuring a teammate by name is encouraged, to give them credit.\n- **Concrete beats clever.** A number, a measurement or a named consequence outperforms wordplay.\n\n### Examples\n\nDo:\n\n- `We measured it: with hexagonal architecture the agent needed 3 to 5x more context to make the same change.`\n- `Our CI took 22 minutes. One integration test was eating 60% of that, because it span up a real Postgres on every run.`\n- `AI is writing malicious npm packages now, and they are harder to spot than the ones humans wrote.`\n\nDon't:\n\n- `Have you ever wondered why your CI is so slow? 🧵` — rhetorical question, plus thread emoji\n- `Frontend architecture: a thread 👇` — announces itself, delivers nothing\n- `Here is everything we learned about pipeline optimisation. Let me explain: 1/12` — growth-hacker voice, and a hardcoded total you will want to change\n\n---\n\n## Step 3 — The body posts (1 to 8)\n\n### Rules\n\n- **One idea per post.** If a post carries two ideas, it is two posts.\n- **Every post must parse alone.** No post may depend on having read the previous one. Openers that dangle — \"And that is when we realised\", \"This is why it matters\" — are meaningless in a timeline.\n- **Every post should be quotable.** Assume any one of them gets quoted with no context attached.\n- **Report the character count** for each, and keep every one under 280.\n- **Vary the length on purpose.** Length is a rhythm instrument: a 90-character post lands a beat, a 250-character one carries the detail an argument needs. Do not let every post settle into the same band — a thread where all posts measure roughly the same reads as something generated, not written. Put the short ones where you want the reader to stop.\n- **Use short lines and blank lines** as the structure. That is the whole formatting toolkit.\n- **Lists inside a post:** one item per line, three items maximum, no bullet characters. More than three means it should be several posts.\n- **Numbering:** only if the thread is genuinely enumerable. Numbering a narrative turns it into a listicle. Never hardcode a total (`1/7`) — you will add or cut a post.\n- **Code:** one short snippet at most, as an image.\n- **No links.** One link per thread, in the closing post.\n\nGive one post to the honest limitation — where the idea stops working. A thread that says so is trusted more than one that does not.\n\n### Example\n\n> Don't: `And that was when we found the real problem.`\n>\n> Do: `The real problem was the test, not the pipeline. It span up a real Postgres for every run — 13 of the 22 minutes.`\n\n---\n\n## Step 4 — The closing post\n\n**Blog-derived** — the link, phrased naturally. No \"click here\", no exclamation marks.\n\n- `Full breakdown, with the numbers: [url]`\n- `We wrote up the whole migration here: [url]`\n\n**Native** — a statement that encapsulates the spine. Memorable, not a generic call to action. `Building with intention, not chaos` — not `Read more on our blog`.\n\nOn a personal account, this is where the single `@WeOrbitant` mention goes, if the work was Orbitant's.\n\n**No engagement bait.** Not \"Follow for more\", not \"Bookmark this\", not \"What do you think?\", not \"Agree?\", not \"RT if you have lived this\".\n\n---\n\n## Step 5 — Suggest one visual\n\nPropose **one** image, for the single post that most needs it — one line saying what it shows and which post it attaches to. Not a brief per post.\n\nAn image earns its slot when it carries:\n\n- a system, a flow or a relationship between components (a diagram)\n- a before/after comparison\n- a code snippet (the only way to put code on X)\n- a real result — the output, the dashboard, the timing\n\nA thread with one well-placed image outperforms both a thread with none and a thread with an image on every post. If nothing in that list applies, say no image is needed. A decorative image costs attention and returns nothing.\n\n---\n\n## Hashtags\n\n**Do not use hashtags on X.** Not one. The single exception is a live event tag when there is a real convening hashtag people are actively clicking — a conference Orbitant is at or sponsoring.\n\nThey have lost their discovery function. The timeline surfaces content by semantic relevance and engagement graph, not by hashtag index. Two or more now read as bot behaviour and correlate with *less* reach.\n\nHashtag conventions from Orbitant's other channels do not carry over to X. This is deliberate — do not add them back for consistency.\n\nOn X the brand appears as **`@WeOrbitant`**, which is a mention, and mentions do work.\n\n---\n\n## Output format\n\nPlain text, ready to paste into X, Typefully or n8n. No markdown in the post bodies.\n\n**The `POST n — c/280` line is the delimiter, and that is a contract.** One header line per post, one blank line between posts, nothing else at that level: a scheduler or an n8n step splits the thread deterministically on it, and a reviewer reads the same artifact. Do not emit a second, undivided copy of the thread alongside it — the split IS the work, and two copies drift the moment a reviewer corrects one.\n\n**Never hand a thread to a tool that splits by length.** An auto-splitter cuts at 280 characters wherever that falls, which undoes every rule above: posts stop being one idea each, stop parsing alone and stop being quotable. The boundaries here are decided, not incidental.\n\n```text\nTHREAD — [spine in one sentence]\n\nAccount: @WeOrbitant (company) | personal — [name]\nLanguage: [es | en]\nSource: [blog post URL | native: what it came from]\n\nPOST 1 — [n]/280\n[opening post]\n\nPOST 2 — [n]/280\n[body post]\n\nPOST 3 — [n]/280\n[body post]\n\nPOST 4 — [n]/280\n[body post]\n\nPOST 5 — [n]/280\n[closing post]\n\nIMAGE — attach to POST [n]\n[what it shows, one line]\n```\n\n**Length is whatever the spine needs.** Three posts is a thread; ten is the ceiling, and more than that means the spine is carrying too much. There is no floor to reach: if the argument is spent after one body post, the thread is three posts. If it fits in a single post, deliver one post and say it is not a thread.\n\n### Self-check before delivering\n\nVerify each of these. Do not deliver a thread that fails one.\n\n- [ ] A character count reported for every post, none over 280\n- [ ] The post lengths vary; they have not all settled into the same band\n- [ ] The opening post has no link\n- [ ] The opening post delivers value standing alone\n- [ ] Every body post parses with no prior context\n- [ ] Zero hashtags, or one real event tag\n- [ ] No markdown syntax anywhere in the post bodies\n- [ ] Exactly one link, in the closing post — or none, if native\n- [ ] The spine is a concept or principle, not a tool or a client\n- [ ] The pronoun matches the account\n- [ ] The thread language matches the source language\n- [ ] No more than 10 posts, and none of them padding\n\n---\n\n## Tone\n\nRefer to the `tone` skill for Orbitant's voice. On X specifically:\n\n- **Compress hard.** 280 characters is not a trimmed paragraph, it is a different sentence length. One clause where you would write two.\n- **Concrete over abstract.** Numbers, measurements, named consequences. X punishes vagueness faster than any other channel.\n- **Dry humour is welcome** when it fits naturally. Human, not polished — not forced, not performative.\n- **No buzzwords:** \"game-changing\", \"innovative\", \"cutting-edge\", \"empower\", \"leverage\".\n- **No growth-hacker voice.** The fastest way to lose a technical audience: \"Here is everything you need to know\", \"10 lessons I learned\", \"Most developers get this wrong\", \"This changed how I think about X forever\", \"Steal this\".\n- **In Spanish, the em dash only marks a two-sided aside.** A single-sided dash used as a continuation is an anglicism.\n\n---\n\n## What to avoid\n\n- Recycling copy written for another channel. Start from the source material, never from an existing post.\n- Summarising the source instead of extracting one argument from it.\n- An opening post that only makes sense once you have read the thread.\n- Posts that only make sense once you have read the blog post.\n- Hashtags. Any.\n- A link in the opening post, or links scattered through the body.\n- Markdown syntax — X renders none of it.\n- Code as text.\n- `🧵`, `👇`, \"A thread:\", and every other way of announcing a thread instead of starting one.\n- Engagement bait of any kind, including the closing question.\n- Padding a thin idea to reach a post count. A thread that runs out of argument at post 4 should be four posts, or one.\n",
|
|
209
|
+
"frontmatter": {
|
|
210
|
+
"name": "orbitant-x-thread",
|
|
211
|
+
"description": "X (Twitter) thread writer for Orbitant. Turns a published blog post OR native\nmaterial — a Knowledge Sharing transcript, a Slack thread, a feature just\nshipped, a build-in-public moment — into a thread ready to post: an opening\npost that stands alone, body posts of one idea each, and a closing post,\nevery one annotated with its character count against X's 280 limit.\n\nActivate when the user asks for a thread, an X post or a Twitter post, or says\n\"haz un hilo\", \"convierte esto en un hilo\", \"esto da para un hilo\", \"thread\nthis\", \"algo para X\", \"para Twitter\". Also trigger when the user shares a blog\npost, a transcript or a Slack conversation and asks for social copy while\nmentioning X, Twitter, threads or @WeOrbitant — even if they never say the\nword \"thread\". This skill writes for X only; it is the wrong skill for\nLinkedIn, YouTube or the newsletter.\n",
|
|
212
|
+
"version": "1.0.0",
|
|
213
|
+
"license": "MIT",
|
|
214
|
+
"metadata": {
|
|
215
|
+
"author": "orbitant",
|
|
216
|
+
"tags": "marketing, x, twitter, thread, social-media, content, engagement"
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
"relDir": "skills/x-thread"
|
|
220
|
+
},
|
|
194
221
|
{
|
|
195
222
|
"name": "orbitant-yt-description",
|
|
196
223
|
"folder": "yt-description",
|
package/package.json
CHANGED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: orbitant-x-thread
|
|
3
|
+
description: |
|
|
4
|
+
X (Twitter) thread writer for Orbitant. Turns a published blog post OR native
|
|
5
|
+
material — a Knowledge Sharing transcript, a Slack thread, a feature just
|
|
6
|
+
shipped, a build-in-public moment — into a thread ready to post: an opening
|
|
7
|
+
post that stands alone, body posts of one idea each, and a closing post,
|
|
8
|
+
every one annotated with its character count against X's 280 limit.
|
|
9
|
+
|
|
10
|
+
Activate when the user asks for a thread, an X post or a Twitter post, or says
|
|
11
|
+
"haz un hilo", "convierte esto en un hilo", "esto da para un hilo", "thread
|
|
12
|
+
this", "algo para X", "para Twitter". Also trigger when the user shares a blog
|
|
13
|
+
post, a transcript or a Slack conversation and asks for social copy while
|
|
14
|
+
mentioning X, Twitter, threads or @WeOrbitant — even if they never say the
|
|
15
|
+
word "thread". This skill writes for X only; it is the wrong skill for
|
|
16
|
+
LinkedIn, YouTube or the newsletter.
|
|
17
|
+
version: "1.0.0"
|
|
18
|
+
license: MIT
|
|
19
|
+
metadata:
|
|
20
|
+
author: orbitant
|
|
21
|
+
tags: marketing, x, twitter, thread, social-media, content, engagement
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Orbitant X Thread Skill
|
|
25
|
+
|
|
26
|
+
A thread is one argument spread across several posts. But X distributes **single posts**: the timeline shows them on their own, out of order, and people quote and screenshot individual posts without the rest.
|
|
27
|
+
|
|
28
|
+
So a thread has two jobs at once. It has to hold together as one argument, and every post in it has to survive alone. Every rule below follows from that.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## What X imposes
|
|
33
|
+
|
|
34
|
+
Platform facts. They are not style preferences and you cannot write around them.
|
|
35
|
+
|
|
36
|
+
- **280 characters per post, hard.** A post at 281 does not post. Count every one.
|
|
37
|
+
- **No text formatting.** X renders no markdown. `**bold**` shows up as literal asterisks, `##` as literal hashes. The line break is the only formatting tool you have.
|
|
38
|
+
- **Posts are read out of order and out of context**, pulled into a timeline between two unrelated things.
|
|
39
|
+
- **Links cost reach.** A link in the opening post suppresses distribution. One link per thread, in the closing post.
|
|
40
|
+
- **Hashtags do nothing.** See the Hashtags section.
|
|
41
|
+
- **Code does not survive as text.** No monospace, and indentation is stripped. Code has to be an image.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Input
|
|
46
|
+
|
|
47
|
+
### Source material
|
|
48
|
+
|
|
49
|
+
Read it in full before writing anything, and identify which kind you have — it decides the closing post.
|
|
50
|
+
|
|
51
|
+
| Source | What it is | Closing post |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| **Blog-derived** | A published post in Markdown, with a URL | Ends with the link |
|
|
54
|
+
| **Native** | KS transcript, Slack thread, a feature just shipped, a build-in-public moment, a decision you made | Ends with a statement, no link |
|
|
55
|
+
|
|
56
|
+
Your job is never to summarise the source. It is to find the one argument inside it that earns a thread.
|
|
57
|
+
|
|
58
|
+
If the material holds no real argument — only an announcement, or a single fact — say so. A thread is the wrong format for it, and one good post beats a padded thread.
|
|
59
|
+
|
|
60
|
+
### Account and voice
|
|
61
|
+
|
|
62
|
+
Ask which account posts if it is not stated and the answer would change the copy. Default to the company account.
|
|
63
|
+
|
|
64
|
+
| Account | Pronoun | Self-mention | Sign-off |
|
|
65
|
+
|---|---|---|---|
|
|
66
|
+
| **Company** (`@WeOrbitant`) | "we" | Never — the account *is* Orbitant | None |
|
|
67
|
+
| **Personal** (a team member) | "I" | One `@WeOrbitant` mention, in the closing post | The lived experience is the sign-off |
|
|
68
|
+
|
|
69
|
+
On a personal account the thread must read as something that person actually did, decided or measured — first person singular. Do not write a company announcement and paste a name on it.
|
|
70
|
+
|
|
71
|
+
### Language
|
|
72
|
+
|
|
73
|
+
**Follow the language of the source.** Spanish material, Spanish thread. English material, English thread. One version — never both, and never a translation alongside.
|
|
74
|
+
|
|
75
|
+
If the source mixes languages, use the language of the bulk of it. Keep technical English terms in English even in a Spanish thread: *framework*, *pipeline*, *deployment*, *token*.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Step 1 — Fix the spine
|
|
80
|
+
|
|
81
|
+
Before writing any post, write the **spine** in one sentence: the single argument the whole thread makes.
|
|
82
|
+
|
|
83
|
+
**The spine is the concept, the principle or the pattern — never the tool, the client or the implementation.** If the source uses a real project, a framework or a specific stack to illustrate the point, those are evidence. They are never the subject.
|
|
84
|
+
|
|
85
|
+
> Spine: "Dependencies pointing inward is what makes business logic survive a framework change."
|
|
86
|
+
>
|
|
87
|
+
> Spine: "The cost of a slow pipeline is not the wait — it is the batching behaviour it forces on the team."
|
|
88
|
+
|
|
89
|
+
**Test:** if you cannot state the spine in one sentence, you do not have a thread yet. You have two threads, or a blog post.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Step 2 — The opening post
|
|
94
|
+
|
|
95
|
+
X surfaces this post on its own. Assume most people read only this one. **It has to deliver value standing alone** — someone who never opens the thread should still walk away with something.
|
|
96
|
+
|
|
97
|
+
### Rules
|
|
98
|
+
|
|
99
|
+
- **A statement, never a rhetorical question.** A question invites "no" and a scroll.
|
|
100
|
+
- **No link.** It goes in the closing post, once.
|
|
101
|
+
- **No thread announcement.** No "🧵", no "A thread:", no "👇", no "Let me explain:". A post that has to announce it is a thread is not a hook.
|
|
102
|
+
- **Target ~200 of the 280 characters.** Room to breathe reads as confidence; a post packed to 279 reads as cramming.
|
|
103
|
+
- **Do not open with "We", "Our" or "Orbitant".** Open with the insight. Exception: featuring a teammate by name is encouraged, to give them credit.
|
|
104
|
+
- **Concrete beats clever.** A number, a measurement or a named consequence outperforms wordplay.
|
|
105
|
+
|
|
106
|
+
### Examples
|
|
107
|
+
|
|
108
|
+
Do:
|
|
109
|
+
|
|
110
|
+
- `We measured it: with hexagonal architecture the agent needed 3 to 5x more context to make the same change.`
|
|
111
|
+
- `Our CI took 22 minutes. One integration test was eating 60% of that, because it span up a real Postgres on every run.`
|
|
112
|
+
- `AI is writing malicious npm packages now, and they are harder to spot than the ones humans wrote.`
|
|
113
|
+
|
|
114
|
+
Don't:
|
|
115
|
+
|
|
116
|
+
- `Have you ever wondered why your CI is so slow? 🧵` — rhetorical question, plus thread emoji
|
|
117
|
+
- `Frontend architecture: a thread 👇` — announces itself, delivers nothing
|
|
118
|
+
- `Here is everything we learned about pipeline optimisation. Let me explain: 1/12` — growth-hacker voice, and a hardcoded total you will want to change
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Step 3 — The body posts (1 to 8)
|
|
123
|
+
|
|
124
|
+
### Rules
|
|
125
|
+
|
|
126
|
+
- **One idea per post.** If a post carries two ideas, it is two posts.
|
|
127
|
+
- **Every post must parse alone.** No post may depend on having read the previous one. Openers that dangle — "And that is when we realised", "This is why it matters" — are meaningless in a timeline.
|
|
128
|
+
- **Every post should be quotable.** Assume any one of them gets quoted with no context attached.
|
|
129
|
+
- **Report the character count** for each, and keep every one under 280.
|
|
130
|
+
- **Vary the length on purpose.** Length is a rhythm instrument: a 90-character post lands a beat, a 250-character one carries the detail an argument needs. Do not let every post settle into the same band — a thread where all posts measure roughly the same reads as something generated, not written. Put the short ones where you want the reader to stop.
|
|
131
|
+
- **Use short lines and blank lines** as the structure. That is the whole formatting toolkit.
|
|
132
|
+
- **Lists inside a post:** one item per line, three items maximum, no bullet characters. More than three means it should be several posts.
|
|
133
|
+
- **Numbering:** only if the thread is genuinely enumerable. Numbering a narrative turns it into a listicle. Never hardcode a total (`1/7`) — you will add or cut a post.
|
|
134
|
+
- **Code:** one short snippet at most, as an image.
|
|
135
|
+
- **No links.** One link per thread, in the closing post.
|
|
136
|
+
|
|
137
|
+
Give one post to the honest limitation — where the idea stops working. A thread that says so is trusted more than one that does not.
|
|
138
|
+
|
|
139
|
+
### Example
|
|
140
|
+
|
|
141
|
+
> Don't: `And that was when we found the real problem.`
|
|
142
|
+
>
|
|
143
|
+
> Do: `The real problem was the test, not the pipeline. It span up a real Postgres for every run — 13 of the 22 minutes.`
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Step 4 — The closing post
|
|
148
|
+
|
|
149
|
+
**Blog-derived** — the link, phrased naturally. No "click here", no exclamation marks.
|
|
150
|
+
|
|
151
|
+
- `Full breakdown, with the numbers: [url]`
|
|
152
|
+
- `We wrote up the whole migration here: [url]`
|
|
153
|
+
|
|
154
|
+
**Native** — a statement that encapsulates the spine. Memorable, not a generic call to action. `Building with intention, not chaos` — not `Read more on our blog`.
|
|
155
|
+
|
|
156
|
+
On a personal account, this is where the single `@WeOrbitant` mention goes, if the work was Orbitant's.
|
|
157
|
+
|
|
158
|
+
**No engagement bait.** Not "Follow for more", not "Bookmark this", not "What do you think?", not "Agree?", not "RT if you have lived this".
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Step 5 — Suggest one visual
|
|
163
|
+
|
|
164
|
+
Propose **one** image, for the single post that most needs it — one line saying what it shows and which post it attaches to. Not a brief per post.
|
|
165
|
+
|
|
166
|
+
An image earns its slot when it carries:
|
|
167
|
+
|
|
168
|
+
- a system, a flow or a relationship between components (a diagram)
|
|
169
|
+
- a before/after comparison
|
|
170
|
+
- a code snippet (the only way to put code on X)
|
|
171
|
+
- a real result — the output, the dashboard, the timing
|
|
172
|
+
|
|
173
|
+
A thread with one well-placed image outperforms both a thread with none and a thread with an image on every post. If nothing in that list applies, say no image is needed. A decorative image costs attention and returns nothing.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Hashtags
|
|
178
|
+
|
|
179
|
+
**Do not use hashtags on X.** Not one. The single exception is a live event tag when there is a real convening hashtag people are actively clicking — a conference Orbitant is at or sponsoring.
|
|
180
|
+
|
|
181
|
+
They have lost their discovery function. The timeline surfaces content by semantic relevance and engagement graph, not by hashtag index. Two or more now read as bot behaviour and correlate with *less* reach.
|
|
182
|
+
|
|
183
|
+
Hashtag conventions from Orbitant's other channels do not carry over to X. This is deliberate — do not add them back for consistency.
|
|
184
|
+
|
|
185
|
+
On X the brand appears as **`@WeOrbitant`**, which is a mention, and mentions do work.
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Output format
|
|
190
|
+
|
|
191
|
+
Plain text, ready to paste into X, Typefully or n8n. No markdown in the post bodies.
|
|
192
|
+
|
|
193
|
+
**The `POST n — c/280` line is the delimiter, and that is a contract.** One header line per post, one blank line between posts, nothing else at that level: a scheduler or an n8n step splits the thread deterministically on it, and a reviewer reads the same artifact. Do not emit a second, undivided copy of the thread alongside it — the split IS the work, and two copies drift the moment a reviewer corrects one.
|
|
194
|
+
|
|
195
|
+
**Never hand a thread to a tool that splits by length.** An auto-splitter cuts at 280 characters wherever that falls, which undoes every rule above: posts stop being one idea each, stop parsing alone and stop being quotable. The boundaries here are decided, not incidental.
|
|
196
|
+
|
|
197
|
+
```text
|
|
198
|
+
THREAD — [spine in one sentence]
|
|
199
|
+
|
|
200
|
+
Account: @WeOrbitant (company) | personal — [name]
|
|
201
|
+
Language: [es | en]
|
|
202
|
+
Source: [blog post URL | native: what it came from]
|
|
203
|
+
|
|
204
|
+
POST 1 — [n]/280
|
|
205
|
+
[opening post]
|
|
206
|
+
|
|
207
|
+
POST 2 — [n]/280
|
|
208
|
+
[body post]
|
|
209
|
+
|
|
210
|
+
POST 3 — [n]/280
|
|
211
|
+
[body post]
|
|
212
|
+
|
|
213
|
+
POST 4 — [n]/280
|
|
214
|
+
[body post]
|
|
215
|
+
|
|
216
|
+
POST 5 — [n]/280
|
|
217
|
+
[closing post]
|
|
218
|
+
|
|
219
|
+
IMAGE — attach to POST [n]
|
|
220
|
+
[what it shows, one line]
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Length is whatever the spine needs.** Three posts is a thread; ten is the ceiling, and more than that means the spine is carrying too much. There is no floor to reach: if the argument is spent after one body post, the thread is three posts. If it fits in a single post, deliver one post and say it is not a thread.
|
|
224
|
+
|
|
225
|
+
### Self-check before delivering
|
|
226
|
+
|
|
227
|
+
Verify each of these. Do not deliver a thread that fails one.
|
|
228
|
+
|
|
229
|
+
- [ ] A character count reported for every post, none over 280
|
|
230
|
+
- [ ] The post lengths vary; they have not all settled into the same band
|
|
231
|
+
- [ ] The opening post has no link
|
|
232
|
+
- [ ] The opening post delivers value standing alone
|
|
233
|
+
- [ ] Every body post parses with no prior context
|
|
234
|
+
- [ ] Zero hashtags, or one real event tag
|
|
235
|
+
- [ ] No markdown syntax anywhere in the post bodies
|
|
236
|
+
- [ ] Exactly one link, in the closing post — or none, if native
|
|
237
|
+
- [ ] The spine is a concept or principle, not a tool or a client
|
|
238
|
+
- [ ] The pronoun matches the account
|
|
239
|
+
- [ ] The thread language matches the source language
|
|
240
|
+
- [ ] No more than 10 posts, and none of them padding
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Tone
|
|
245
|
+
|
|
246
|
+
Refer to the `tone` skill for Orbitant's voice. On X specifically:
|
|
247
|
+
|
|
248
|
+
- **Compress hard.** 280 characters is not a trimmed paragraph, it is a different sentence length. One clause where you would write two.
|
|
249
|
+
- **Concrete over abstract.** Numbers, measurements, named consequences. X punishes vagueness faster than any other channel.
|
|
250
|
+
- **Dry humour is welcome** when it fits naturally. Human, not polished — not forced, not performative.
|
|
251
|
+
- **No buzzwords:** "game-changing", "innovative", "cutting-edge", "empower", "leverage".
|
|
252
|
+
- **No growth-hacker voice.** The fastest way to lose a technical audience: "Here is everything you need to know", "10 lessons I learned", "Most developers get this wrong", "This changed how I think about X forever", "Steal this".
|
|
253
|
+
- **In Spanish, the em dash only marks a two-sided aside.** A single-sided dash used as a continuation is an anglicism.
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## What to avoid
|
|
258
|
+
|
|
259
|
+
- Recycling copy written for another channel. Start from the source material, never from an existing post.
|
|
260
|
+
- Summarising the source instead of extracting one argument from it.
|
|
261
|
+
- An opening post that only makes sense once you have read the thread.
|
|
262
|
+
- Posts that only make sense once you have read the blog post.
|
|
263
|
+
- Hashtags. Any.
|
|
264
|
+
- A link in the opening post, or links scattered through the body.
|
|
265
|
+
- Markdown syntax — X renders none of it.
|
|
266
|
+
- Code as text.
|
|
267
|
+
- `🧵`, `👇`, "A thread:", and every other way of announcing a thread instead of starting one.
|
|
268
|
+
- Engagement bait of any kind, including the closing question.
|
|
269
|
+
- Padding a thin idea to reach a post count. A thread that runs out of argument at post 4 should be four posts, or one.
|