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