|
1
|
--- |
|
2
|
name: content-machine |
|
3
|
description: Create social media posts, newsletters, and marketing content across platforms. |
|
4
|
--- |
|
5
|
|
|
6
|
# Content Machine |
|
7
|
|
|
8
|
Create social posts, newsletters, and marketing copy that respects platform mechanics — truncation points, algorithm signals, and hook physics — not just "good writing." |
|
9
|
|
|
10
|
## When to Use |
|
11
|
|
|
12
|
- Social posts (X/Twitter, LinkedIn, Instagram feed, Instagram Stories, TikTok captions, Threads) |
|
13
|
- Writing captions for social media posts |
|
14
|
|
|
15
|
- Writing hooks for posts and content |
|
16
|
- Newsletters, blog posts, content calendars, cross-platform repurposing |
|
17
|
|
|
18
|
- Content repurposing ("turn this into multiple posts", "repurpose this blog post") |
|
19
|
- Social media strategy and content planning |
|
20
|
|
|
21
|
## When NOT to Use |
|
22
|
|
|
23
|
- Cold outreach (cold-email-writer) · Paid ad copy (ad-creative) · Research reports (deep-research) · SEO audits (seo-auditor) |
|
24
|
|
|
25
|
## Step 1: Voice Analysis |
|
26
|
|
|
27
|
Ask for 3-5 existing posts. Extract: avg sentence length, contraction usage, emoji density, POV (I/we/you), signature phrases. If none exist, ask for 2 creators they want to sound like and use `webFetch` to pull recent posts as voice reference. |
|
28
|
|
|
29
|
## Step 2: Platform Mechanics (2025-2026 Specs) |
|
30
|
|
|
31
|
### LinkedIn — 3,000 char max, but truncation is what matters |
|
32
|
|
|
33
|
- **"...see more" cutoff: ~140 chars desktop, ~110 chars mobile.** 57%+ of LinkedIn traffic is mobile — write the hook for 110 chars. |
|
34
|
- **Algorithm weights:** comments count ~2x likes; dwell time is a primary signal; first 60-120 min engagement velocity determines reach ceiling. |
|
35
|
|
|
36
|
- **Optimal length:** 800-1,000 chars (not 3,000). Short paragraphs (1-2 lines) + white space increase dwell time. |
|
37
|
- **Structure:** Hook (110 chars, no throat-clearing like "I wanted to share...") → story/insight → single question CTA. Reply to every comment in the first hour to extend the test window. |
|
38
|
|
|
39
|
- **Hashtags:** 3-5 max, at the very end. LinkedIn deprioritized hashtag discovery. |
|
40
|
|
|
41
|
### X/Twitter — 280 chars (free), 25,000 chars (Premium) |
|
42
|
|
|
43
|
- Long posts on Premium truncate at ~280 chars in the feed — the hook rule still applies. |
|
44
|
- **Thread structure:** Tweet 1 = the full promise ("How I went from X to Y in Z — thread 🧵"). Each tweet must stand alone for retweets. Last tweet = CTA + loop back to tweet 1. |
|
45
|
|
|
46
|
- Line breaks double engagement vs. wall-of-text. |
|
47
|
|
|
48
|
### Instagram Feed — 2,200 char caption, ~125 chars visible before "...more" |
|
49
|
|
|
50
|
- **Hashtags: 3-5, not 30.** Instagram's @creators account officially reversed the old advice; 20+ hashtags now reads as spam and can suppress reach. Put them inline or at the end, not in a comment. |
|
51
|
- First line = hook. Emoji as bullet points scan faster than dashes on mobile. |
|
52
|
|
|
53
|
- Format: Square (1080×1080) or portrait (1080×1350, 4:5 — outperforms square on CTR). |
|
54
|
|
|
55
|
### Instagram Stories — 1080×1920, 9:16 |
|
56
|
|
|
57
|
Stories are a fundamentally different medium from feed posts. Treat them as such. |
|
58
|
|
|
59
|
#### Key differences from feed |
|
60
|
|
|
61
|
- Stories are **ephemeral and sequential** — viewers tap through in 2-3 seconds. There is no caption to read. The visual *is* the entire message. |
|
62
|
- Stories are better for **two-way interactions** (polls, questions, DMs) than for broadcasting. |
|
63
|
|
|
64
|
- Feed posts have copy doing the heavy lifting. Stories must work without it. |
|
65
|
|
|
66
|
##### Safe zones — mandatory |
|
67
|
|
|
68
|
| Zone | Range | Why | |
|
69
|
|
|
70
|
|---|---|---| |
|
71
|
|
|
72
|
| Top dead zone | Top 14% (~270px) | Profile name, mute, close button UI | |
|
73
|
|
|
74
|
| Bottom dead zone | Bottom 20% (~380px) | "Send message" bar + swipe-up area | |
|
75
|
|
|
76
|
| **Safe core**|**14% – 80% from top** | All content must live here | |
|
77
|
|
|
78
|
Never place any text, logo, CTA, or key visual outside the safe core. |
|
79
|
|
|
80
|
###### Story formats by content type |
|
81
|
|
|
82
|
| Content angle | Best story format | Why | |
|
83
|
|
|
84
|
|---|---|---| |
|
85
|
|
|
86
|
| Pain point | Single frame, stripped to one-liner | Needs immediate gut impact — no room for buildup | |
|
87
|
|
|
88
|
| Educational | Poll (two-option) | Polls get 3× more taps than passive stories; drives return for "reveal" | |
|
89
|
|
|
90
|
| Feature/product | 3-frame sequence: Problem → Solution → Result | Complex message needs beats; tap-through is an algorithm signal | |
|
91
|
|
|
92
|
| Relationship/split concept | Vertical split visual | 9:16 is naturally tall — a top/bottom split reads instantly | |
|
93
|
|
|
94
|
| Tips list | One tip per frame (e.g., "Tip 1 de 3") | Breaks up information; each frame drives tap-through to next | |
|
95
|
|
|
96
|
###### Story copy rules |
|
97
|
|
|
98
|
- Strip feed copy to its absolute core. One line, not a paragraph. |
|
99
|
- The hook becomes the entire visual headline — make it 9-12vw on screen and impossible to miss. |
|
100
|
|
|
101
|
- CTAs live in the bottom safe zone (72-78vh) as a full-width strip or pill — not scattered across the frame. |
|
102
|
- Progress indicators ("1 / 3", three dots) signal sequence to viewers and reduce drop-off between frames. |
|
103
|
|
|
104
|
###### Poll stories |
|
105
|
|
|
106
|
- Two options, both plausible — avoid obvious right answers. |
|
107
|
- Create a reason to return: "Mañana revelamos el promedio real" drives next-day traffic. |
|
108
|
|
|
109
|
- Benchmark: 20-40% response rate on engaged audiences. |
|
110
|
|
|
111
|
###### Multi-frame sequences |
|
112
|
|
|
113
|
- Each frame must have a clear progress indicator so viewers know there's more. |
|
114
|
- Each frame must have a tap hint (e.g., "Toca para continuar →") except the last. |
|
115
|
|
|
116
|
- Last frame ends with a CTA, not a tap hint. |
|
117
|
- File naming: `story3a.html`,`story3b.html`,`story3c.html` for the 3 frames of Story 3. |
|
118
|
|
|
119
|
###### Same angle, different execution — never just resize a feed post |
|
120
|
|
|
121
|
| Feed post | Story adaptation | |
|
122
|
|
|
123
|
|---|---| |
|
124
|
|
|
125
|
| Pain point with supporting copy | Strip to the one-liner only — huge on screen, nothing else | |
|
126
|
|
|
127
|
| Educational post with data | Turn into a poll question — let the audience engage, reveal answer next day | |
|
128
|
|
|
129
|
| Feature walkthrough | 3-frame sequence: Frame 1 = problem, Frame 2 = solution stat, Frame 3 = result UI | |
|
130
|
|
|
131
|
| Relationship/split concept | Vertical split (top half / bottom half) unified at the seam | |
|
132
|
|
|
133
|
| Tips list (3 items) | 3 separate frames, one per tip, "Tip 1 de 3" format | |
|
134
|
|
|
135
|
### TikTok captions — 4,000 chars (up from 2,200) |
|
136
|
|
|
137
|
- TikTok is now a search engine — ~40% of Gen Z searches here before Google. Front-load keywords in the caption for TikTok SEO. The caption is indexed; use it for terms your video doesn't say out loud. |
|
138
|
|
|
139
|
### TikTok Video Production (Composited Short-Form Video) |
|
140
|
|
|
141
|
The skill CAN produce TikTok-format video (1080×1920, 9:16) using FFmpeg + AI-generated clips. This is not just captions — it is full video production. |
|
142
|
|
|
143
|
**API capability disclosure — mandatory before starting:** When producing TikTok video, always inform the user upfront that two quality tiers exist: |
|
144
|
|
|
145
|
- **Without an external API (default):** AI-generated clips via the built-in media-generation tool — cinematic-style footage, good for most use cases, no extra setup or cost. |
|
146
|
- **With an external API (higher quality):** Services like Runway Gen-3, Pika, or Kling can produce significantly more realistic and controllable footage, but require a paid API key from the user. |
|
147
|
|
|
148
|
Always present both options and ask which they prefer before generating any clips. Never silently call a paid external API. Never assume the user knows these options exist — they usually don't. |
|
149
|
|
|
150
|
#### Production workflow |
|
151
|
|
|
152
|
1. Write a scene brief: 3-5 scenes, each with a visual prompt, text overlays, and duration (6-8s per scene is ideal). Total target: 20-30s. |
|
153
|
2. Generate AI clips using the media-generation skill — one prompt per scene, 9:16 format. |
|
154
|
|
|
155
|
3. Prepare brand fonts and assets (logo PNG). |
|
156
|
4. Compose with FFmpeg using a Node.js script (`.cjs`). |
|
157
|
|
|
158
|
5. Output to `client/public/videos/`— served at`/videos/` on the Replit domain. |
|
159
|
|
|
160
|
##### FFmpeg in Replit NixOS |
|
161
|
|
|
162
|
- FFmpeg v6+ is available. Locate it: `ls /nix/store/*ffmpeg-full*/bin/ffmpeg 2>/dev/null | head -1` |
|
163
|
- Run via `execFileSync('ffmpeg', args)` — do NOT use shell string commands (escaping nightmare). |
|
164
|
|
|
165
|
###### Font handling — Inter (or any Google Font) |
|
166
|
|
|
167
|
- Download the GitHub release zip: `https://github.com/rsms/inter/releases/download/v4.0/Inter-4.0.zip` |
|
168
|
- Extract TTF files using Node.js `zlib.inflateRawSync()`— do not assume`unzip` or Python are available. |
|
169
|
|
|
170
|
- Write to `/tmp/tiktok/fonts/Inter-Black.ttf`,`Inter-Bold.ttf`,`Inter-Regular.ttf`. |
|
171
|
- Always use the brand font. DejaVu (FFmpeg's fallback) looks wrong on brand content. |
|
172
|
|
|
173
|
###### FFmpeg filter techniques |
|
174
|
|
|
175
|
```bash |
|
176
|
|
|
177
|
# Dark overlay for text readability on top of any clip |
|
178
|
|
|
179
|
drawbox=x=0:y=0:w=iw:h=ih:color=0x000000@0.50:t=fill |
|
180
|
|
|
181
|
# Text overlay — use execFileSync (array args), never shell strings, so UTF-8 works directly |
|
182
|
|
|
183
|
drawtext=fontfile='/path/Inter-Black.ttf':fontsize=110:fontcolor=0xffffff:x=(w-text_w)/2:y=700:text='Tu texto aqui' |
|
184
|
|
|
185
|
# Logo overlay — scale first, split for N scenes, then overlay each |
|
186
|
|
|
187
|
[logoInput]scale=185:-1,split=4[logo0][logo1][logo2][logo3] |
|
188
|
|
|
189
|
[clip_pre][logo0]overlay=x=65:y=72:format=auto[clip_out] |
|
190
|
|
|
191
|
# Xfade transition between clips (0.4s fade) |
|
192
|
|
|
193
|
[c0][c1]xfade=transition=fade:duration=0.4:offset=5.6[v01] |
|
194
|
|
|
195
|
# Audio: music bed, trim to total duration, fade in/out |
|
196
|
|
|
197
|
[musicInput]atrim=0:24.8,afade=t=in:st=0:d=1.0,afade=t=out:st=23.0:d=1.8[aout] |
|
198
|
|
|
199
|
``` |
|
200
|
|
|
201
|
###### Scene structure that works (4-scene formula) |
|
202
|
|
|
203
|
| Scene | Clip prompt | Text role | Duration | |
|
204
|
|
|
205
|
|---|---|---|---| |
|
206
|
|
|
207
|
| Hook | Person reacting to a pain point (wide shot) | Big provocative question, brand color accent | 6s | |
|
208
|
|
|
209
|
| Pain | Close-up showing the problem (phone, account, etc.) | Short punchy lines, high contrast | 6s | |
|
210
|
|
|
211
|
| Solution | App/product in use or aspirational moment | Feature bullets, subdued overlay (show the product) | 6s | |
|
212
|
|
|
213
|
| CTA | Positive resolution, couple/family | Download prompt, URL badge, attribution | 8s | |
|
214
|
|
|
215
|
###### Overlay composition rules |
|
216
|
|
|
217
|
- Dark overlay alpha: 0.40–0.55 for clips that need text; 0.35–0.45 for product/app clips (show them). |
|
218
|
- Text hierarchy: headline in brand color or white at 110-130px (Inter Black), body at 50-70px (Inter Bold), captions at 36-44px (Inter Regular). |
|
219
|
|
|
220
|
- Logo: top-left corner, ~185px wide, every scene — use `scale=185:-1,split=N`. |
|
221
|
- All content within 140px–1780px vertical (safe zone same as Stories: avoid top 14% and bottom 20%). |
|
222
|
|
|
223
|
###### Output settings (always use these exactly) |
|
224
|
|
|
225
|
```text |
|
226
|
|
|
227
|
-c:v libx264 -preset fast -crf 18 -pix_fmt yuv420p -movflags +faststart -c:a aac -b:a 192k |
|
228
|
|
|
229
|
``` |
|
230
|
|
|
231
|
###### Music licensing |
|
232
|
|
|
233
|
- If using CC BY music (e.g., Kevin MacLeod), attribution must appear IN the video (small text overlay, last scene), not just in the caption. Caption-only attribution does not satisfy CC BY for video. |
|
234
|
- Recommended free source: freemusicarchive.org, filter by CC BY. |
|
235
|
|
|
236
|
###### Canvas embedding |
|
237
|
|
|
238
|
- Always resolve the domain with `echo $REPLIT_DOMAINS` before setting a canvas video shape URL. Never hardcode a domain — Replit domains change between sessions. |
|
239
|
- Video shape URL format: `https://<domain>/videos/filename.mp4` |
|
240
|
|
|
241
|
### Newsletters — Optimize for clicks, not opens |
|
242
|
|
|
243
|
- **Apple Mail Privacy Protection (MPP) inflates open rates by ~18 percentage points.**Apple Mail is ~46% market share and pre-fetches tracking pixels. A "42% open rate" in 2025 ≈ a 24% open rate in 2020.**Track click rate (benchmark: ~2%) and CTOR (10-20%) instead.** |
|
244
|
- **Subject line:** 30-50 chars. Avoid "Free," ALL CAPS, multiple "!!!" — spam filter triggers. B2B: longer, specific subject lines outperform short clever ones. |
|
245
|
|
|
246
|
- **Preview/preheader text:** adds ~6pp to open rate when used — but Gmail's Gemini now auto-generates previews, so don't rely on controlling it. Write the first sentence of the body as a second hook. |
|
247
|
- One primary CTA. Every additional CTA cuts click rate. |
|
248
|
|
|
249
|
## Step 3: Hook Formulas (Named Patterns) |
|
250
|
|
|
251
|
Don't say "write a hook" — pick a pattern: |
|
252
|
|
|
253
|
| Pattern | Template | Why it works | |
|
254
|
|
|
255
|
|---|---|---| |
|
256
|
|
|
257
|
| **Contrarian** | "Everyone says X. Here's why that's wrong." | Cognitive dissonance forces resolution | |
|
258
|
|
|
259
|
| **Curiosity gap** | "I tried X for 30 days. Day 17 broke me." | Open loop — brain needs closure | |
|
260
|
|
|
261
|
| **Specificity signal** | "$47,212 in 90 days. Here's the exact stack." | Odd numbers read as true, round numbers read as marketing | |
|
262
|
|
|
263
|
| **Negative hook** | "3 mistakes that cost me [outcome]" | Loss aversion > gain seeking | |
|
264
|
|
|
265
|
| **Callout** | "If you're a [role] still doing X, read this." | Self-selection = higher-intent readers | |
|
266
|
|
|
267
|
| **Slippery slope** | "It started with one Slack message." | Narrative momentum | |
|
268
|
|
|
269
|
| **Permission** | "Unpopular opinion: [take]" | Pre-frames disagreement as expected | |
|
270
|
|
|
271
|
**Banned openers:** "I'm excited to share," "Hey everyone," "As a [title]," "In today's fast-paced world." |
|
272
|
|
|
273
|
## Step 4: Repurposing Waterfall |
|
274
|
|
|
275
|
One long-form piece → 8+ assets: |
|
276
|
|
|
277
|
1. **Blog post** (1,500 words) → |
|
278
|
2. **X thread** (extract each H2 as a tweet, intro = hook) → |
|
279
|
|
|
280
|
3. **LinkedIn post** (pick the single most contrarian point, 800 chars) → |
|
281
|
4. **LinkedIn carousel** (each H2 = 1 slide; carousels get highest dwell time) → |
|
282
|
|
|
283
|
5. **Newsletter section** (add personal context + behind-the-scenes) → |
|
284
|
6. **Instagram feed post** (hook + 3-5 supporting points, 1080×1080 or 1080×1350) → |
|
285
|
|
|
286
|
7. **Instagram Story** (strip the feed hook to a single line, or turn the educational point into a poll) → |
|
287
|
8. **TikTok/Reel script** (the hook + the \#1 takeaway in 30 sec) |
|
288
|
|
|
289
|
**Key rule for Stories in the waterfall:** same *angle*as the feed post, completely different*execution*. Never just crop or resize a feed post into a Story — re-author it according to the story format table above. |
|
290
|
|
|
291
|
Build repurposing scripts in Python when batch-processing: parse markdown H2s → split into platform templates → enforce char limits programmatically. |
|
292
|
|
|
293
|
## Content Frameworks |
|
294
|
|
|
295
|
- **PAS** (Problem → Agitate → Solve) — best for conversion-focused posts |
|
296
|
- **BAB** (Before → After → Bridge) — best for transformation stories |
|
297
|
|
|
298
|
- **AIDA** (Attention → Interest → Desire → Action) — best for launches |
|
299
|
- **SLAP** (Stop → Look → Act → Purchase) — best for short-form (Reels/TikTok captions) |
|
300
|
|
|
301
|
## Validation |
|
302
|
|
|
303
|
Before delivering, verify: |
|
304
|
|
|
305
|
- Char counts against platform limits (count programmatically, don't eyeball) |
|
306
|
- Hook fits in the truncation window (110 chars for LinkedIn mobile, 125 for Instagram feed) |
|
307
|
|
|
308
|
- No banned openers |
|
309
|
- One CTA per piece |
|
310
|
|
|
311
|
- For Stories: all content confirmed inside the 14%–80% safe zone |
|
312
|
|
|
313
|
## Limitations |
|
314
|
|
|
315
|
- Cannot post to platforms or access analytics |
|
316
|
- Cannot generate static images directly — use the media-generation skill for images; use the ad-creative skill for HTML/CSS visual story designs |
|
317
|
|
|
318
|
- **CAN produce composited short-form video** (TikTok/Reels) via FFmpeg + AI clip generation — see TikTok Video Production section above |
|
319
|
- Paid external video APIs (Runway, Pika, Kling) require user consent and their own API key before use |
|
320
|
|
|
321
|
- Voice matching quality scales with example count |