| name | social-caption-writer |
| description | Optional polish pass—hooks, hashtag variants, thread layout—from existing post-body.md or teaser.md; default pipeline skips this when x-post-writer/social-content-writer already ship publish-ready copy. |
| metadata | {"clawdbot":{"emoji":"✍️"},"openclaw":{"emoji":"✍️"}} |
social-caption-writer
Optional skill. x-post-writer, social-content-writer, and linkedin-article-writer (teaser.md) are expected to deliver publish-ready text (including hashtags) so social-media-manager can bundle without this step.
Use social-caption-writer when the human wants extra hook variants, hashtag refresh, thread re-split, or platform-specific polish on top of an existing draft.
Copy-only execution: you do not invent the post from a one-line calendar row alone when a full draft already exists. Prefer post body in → caption package out. Same rigor as qf-course-researcher (explicit rules, character math, not vibes).
Pipeline position (when used)
marketer-agent → … → calendar.md.
x-post-writer / social-content-writer / linkedin-article-writer → post-body.md or teaser.md; auto-image-generation → post-image.png / article-hero.png + image-alt.txt.
- (Optional)
social-caption-writer → captions/*.md (may reference image-alt.txt for consistency).
social-media-manager → post-bundle.md, APPROVAL.md, hype-engine.
When the human says “captions for the April calendar” without opting into this skill, prefer re-running the content writer to refresh in-file copy instead.
If step 2 is skipped, you may still run from a full brief (see below)—but when batching, first confirm each slot has a post-body.md, teaser.md, or equivalent; if missing, stop that row with a defer note instead of hallucinating the post.
Prerequisites
Batch mode (e.g. one month / April)
- Open the campaign folder (e.g.
workspace/drafts/social/2026-04-01-acme-launch/).
- Read
calendar.md; for each row in the target month (e.g. April = dates 2026-04-*):
- Resolve
post-id or file path from a Post file / Draft path column if present, else posts/<date>-<slug>/post-body.md.
- If the post file exists → write one caption
.md as below.
- If missing → append a row to
captions/DEFERRED.md with date, slug, reason.
- Summarize counts: written vs deferred.
Credentials & API (qf-style)
- None: Copy-only artifacts. Posting for
twitter_x and linkedin_feed goes social-media-manager → hype-engine (HypeEngine Posts API; config ~/.config/hype-engine/). Other platforms: INTEGRATIONS.md or OpenClaw channels per TOOLS.md.
High-level Workflow
-
Platform constraint sheet (top of file)
-
Paste relevant row:
| Platform | Body limit (guide) | Hashtags | Link placement |
|---|
| X | 280 or thread | 0–2 inline | often end |
| IG | ~125 chars “above fold” | 3–12 end | bio CTA |
| TikTok | short + line break | 3–6 | phrase + link in bio |
| LinkedIn feed | first ~210 chars hook | 3–5 professional | comment strategy note |
| Facebook | 1–3 short paragraphs | optional | mid or end |
-
Hook variants
- 3 options labeled A/B/C; each ≤ 12 words for short-form first line.
-
Body
- Chosen hook expanded; paragraphs for long platforms; single block for short.
-
Hashtag block
- On new line; research-style mix: broad + niche; no banned/spam tags.
-
Thread plan (X only)
- If >280:
Thread 1/… sections with character count estimate per tweet.
-
Accessibility
- Note: avoid emoji-only meaning; alt text suggestion for paired image (one line).
-
Compliance footer
#ad, #sponsored, AI disclosure line if USER.md requires.
-
Handoff section
- “Merged by: social-media-manager into post-bundle
<id>.”
Outputs (required)
- One
.md per (date, topic, platform) with sections above.
Agent Checklist