Blog Post — Full-Stack Content Production
Turn a topic into a complete, strategy-aware publishing package: long-form post + social adaptations + multimedia assets.
Compounding Skills
This skill orchestrates — it does not re-implement what already exists:
| Skill | Role in Pipeline |
|---|---|
/content-creation |
Storytelling frameworks, visual content strategy, social distribution patterns, AI asset generation (Imagen 4.0, Veo 3.1, TTS), Remotion video |
/deep-research |
Multi-source research when topic requires verified claims or data |
/agent-browser |
Screenshots, reference extraction, web research |
/pencil |
Design social cards, carousel slides, diagrams |
/arcan-glass |
BroomVA brand styling for visual assets |
/remotion-best-practices |
Video composition, spring animations, sequencing |
/google-veo |
Veo 3.1 cinematic prompting — camera vocabulary, shot composition, style direction |
/subtitle-generation |
Burn-in subtitles for reels (80% watch muted) |
/prompt-library |
Reusable prompts for content generation |
/competitor-intel |
Market context when writing about products or strategy |
Rule: Before generating content for any phase, check if a compounding skill handles it better. Delegate, don't duplicate.
Modes
Full Pipeline (default)
BRIEF → RESEARCH → ANGLE → OUTLINE → LONG-FORM → ADAPT → MEDIA → STRATEGY → PUBLISH
9 phases, each produces a file or action in the output package.
X-First Mode
BRIEF → ANGLE → X CONTENT → MEDIA → PUBLISH
Lightweight mode for standalone X content — not derived from a blog post. Use when: building in public, reacting to news, sharing a demo, shipping a contrarian take, or posting a terminal screenshot with context. Produces x-post.md and/or x-thread.md with growth-optimized patterns. See references/x-growth-strategy.md.
Triggers: "x post about", "tweet about", "x thread about", "post on x", "ship to x", "build in public"
X-First pipeline:
- Brief — Topic + intent (1 line is enough)
- Angle — Apply the angle test (specificity, tension, evidence) even for short content
- Generate — Use growth-optimized templates: visual proof, native media, engagement hooks, strategic tags
- Media — Terminal screenshot, architecture diagram, demo GIF, or native video (60-90s)
- Publish — Via
xurl postorxurl reply(thread). Always attach media natively (never external links)
X-First content types (see references/x-growth-strategy.md):
- Terminal screenshot + insight (3-5x/week)
- "How I built X" thread (1x/week)
- Demo video, 60-90s native (1x/week)
- Contrarian take (1-2x/week)
- Before/after comparison (1-2x/week)
- "Day N of building X" update (daily optional)
- Strategic reply to big accounts (3-5x/day)
Phase 0: Content Brief Intake
Gather or construct a content brief. See templates/brief.md for the template.
Required fields:
topic— What this post is aboutintent— Why this post exists (educate, persuade, announce, reflect, document)audience— Who reads this (developers, founders, general, specific community)
Optional fields:
platforms— Target channels (default: all). Options:broomva-tech,substack,x-post,x-thread,linkedin,instagram-post,instagram-reeltone— Voice (default: confident-technical). Options:conversational,academic,provocative,reflective,storytellingreferences— URLs, papers, prior posts to build onmedia— Desired outputs:png,mp4,gif,mp3(default: all)cta— What should the reader do after? (follow, subscribe, try, share, discuss)destination— Primary long-form target (default:broomva-tech). Options:substack,medium,dev-to,hashnodeslug— URL-friendly identifier (auto-generated from topic if omitted)
If the user provides only a topic, infer reasonable defaults and confirm before proceeding.
Phase 1: Research & Enrichment
When to research: If the brief includes references, data claims, or the topic requires external validation.
How to research:
- Use
/deep-researchfor topics needing 5+ verified sources - Use
/agent-browserto extract content from reference URLs - Use web search for current data, trends, or competitor context
- Use
/competitor-intelif topic involves market positioning
Output: research.md — key findings, sources, data points, quotes. Keep it factual and citable.
When to skip: Personal reflections, opinion pieces, internal documentation — research is optional, not mandatory.
Phase 2: Angle & Narrative Selection
The angle is what makes content intentional rather than generic. It answers: "Of all the things I could say about this topic, what specific lens am I using and why?"
Angle selection criteria:
- Audience gap — What does this audience need that isn't being said?
- Unique evidence — What data or experience do I have that others don't?
- Contrarian potential — Is there a widely-held belief I can challenge with evidence?
- Timeliness — Is there a current event or trend that makes this relevant now?
- Story potential — Is there a transformation narrative (before → after)?
Framework selection (from /content-creation storytelling references):
| Content Type | Best Framework | When to Use |
|---|---|---|
| Case study / results | PSI (Problem-Solution-Impact) | Showing quantified outcomes |
| Industry take / opinion | ABT (And-But-Therefore) | Challenging conventional wisdom |
| Technical deep dive | 1-3-1 (One idea, three evidence, one takeaway) | Teaching a concept |
| Product / launch story | Pixar Spine | Transformation narrative |
| Data-driven insight | Data Arc (Context-Tension-Resolution) | Leading with surprising numbers |
| Decision documentation | So-What (What-Why-Action) | Internal or reflective posts |
Output: Update outline.md with the chosen angle, framework, and rationale.
Phase 3: Outline Generation
Build a structured outline from the angle. This is the architectural blueprint — all downstream content derives from it.
Outline structure:
# Title Options (3 candidates, pick best)
## Hook (1-2 sentences — the "why should I care" opener)
## Sections
1. [Section name] — [1-line purpose]
- Key point A
- Key point B
- Evidence/data to include
- Media placement: [image/video/gif opportunity]
2. [Section name] — [1-line purpose]
...
## Closing
- Memorable takeaway (one line)
- CTA alignment with brief
## Media Inventory
- Hero image concept
- Supporting images (one per ~300 words)
- Video opportunity (if applicable)
- GIF opportunity (if applicable)
- Audio narration (y/n)
Output: outline.md
Phase 4: Long-Form Content Generation
Write the primary long-form post. Target platform determines format.
broomva.tech (default)
Use the templates/broomva-tech-post.mdx template.
Frontmatter schema:
---
title: "Post Title"
summary: "One-sentence summary for cards and SEO"
date: YYYY-MM-DD
published: true
tags:
- tag1
- tag2
audio: /audio/writing/{slug}.mp3 # if audio generated
---
Content conventions:
- Use standard Markdown (GFM) — the engine renders via remark + remark-gfm
- Embed video:
<video src="/images/writing/{slug}/video.mp4" autoplay muted loop playsinline style="width:100%;border-radius:8px;margin-bottom:1.5rem"></video> - Images:
 - Figures:
<figure><img src="..." alt="..." /><figcaption>Caption</figcaption></figure> - Tables: Standard GFM tables (styled by Tailwind prose)
- No custom MDX components needed — raw HTML works
Substack / Alternative Platforms
Use templates/substack-post.md. Standard Markdown, no frontmatter beyond title/subtitle. Adjust image paths to be relative or hosted URLs.
Output: broomva-tech-post.mdx and/or substack-post.md (based on destination in brief)
Phase 5: Cross-Platform Adaptation
Critical rule: Each platform gets native content, not a copy-paste resize. The core message is shared; the expression is platform-native.
Adaptation Matrix
| Platform | Length | Format | Hook Style | Media | CTA Style |
|---|---|---|---|---|---|
| X blog post | Freeform (no limit) | Long-form article | Narrative hook + hero image | Images, video, GIFs inline | Link + engagement |
| X post | 280 chars | Single tweet | Punchy stat or claim | 1 image | Implied (engagement) |
| X thread | 5-8 tweets | Numbered thread | Scale proof or contrarian | Image every 2-3 tweets | Link in final tweet |
| 1300 chars | Paragraphs + bullets | First 210 chars = hook | 1 image or document carousel | Direct ask | |
| Instagram post | 2200 chars caption | Caption + carousel (1080x1350) | Visual-first, caption supports | 1-10 carousel images | Save/share/link in bio |
| Instagram reel | 15-60s script | Video script + captions | 3-second hook | 9:16 vertical video | Follow/link in bio |
Platform-Specific Content Generation
See references/platform-adaptation.md for detailed per-platform strategies.
X Blog Post — Full long-form article published directly on X (formerly "Twitter Articles"). Freeform length — can match or exceed the broomva.tech post. Supports inline images, videos, GIFs, and rich formatting. Unlike the broomva.tech post, the X blog post is written for X's audience and algorithm — more conversational, more opinionated, more multimedia-dense. Every section should be accompanied by a visual (image, diagram, GIF, or video clip). The hero image is critical — it's the thumbnail that determines clicks. Use Imagen 4.0 for hero + supporting images, Veo 3.1 clips for inline video, and ffmpeg GIFs for demos. See references/x-blog-post.md.
X Post — Extract the single most surprising or provocative insight. Always attach an image (terminal screenshot, diagram, before/after, or generated visual) — text-only posts get 60% less reach. No external links in post body (X suppresses them) — put links in a self-reply. Include an engagement hook: question, contrarian frame, or "reply with your experience." Tag 1-2 relevant accounts when genuinely building on their work. See references/x-growth-strategy.md.
X Thread — Re-tell the story in tweet-sized beats. Each tweet stands alone while building momentum. Spend 50% of effort on tweet 1 — it determines everything. Image every 2-3 tweets (increases completion by 45%). Self-reply the full chain fast (don't trickle). End with CTA: question for replies, Discord invite, or link in final self-reply. Tag the most relevant account in tweet 1 if crediting their work. See references/x-growth-strategy.md.
LinkedIn — Professional framing. Lead with insight or contrarian take in first 210 chars (before "See More" fold). Use bullet lists for key takeaways. 3-5 hashtags max.
Instagram Post — Design a carousel: cover slide with hook, 1 insight per slide (flashcard style, not paragraphs), stat slide, CTA slide. Caption tells the story; slides show the highlights.
Instagram Reel — Write a script with: 3-second visual hook, problem statement (5s), key insight (10-15s), evidence or demo (10-15s), CTA (5s). Vertical 9:16 format. See references/reel-production.md for Veo 3.1 prompting and subtitle burn-in.
Output: x-blog-post.md, x-post.md, x-thread.md, linkedin-post.md, instagram-post.md, instagram-reel.md
Phase 6: Multimedia Production
Plan and produce media assets. See references/multimedia-production.md.
Asset Types
| Asset | Tool | When |
|---|---|---|
| Hero image / social card | Nano Banana (gemini-3.1-flash-image) |
Always — every post needs a hero |
| Supporting images | Nano Banana or /agent-browser screenshots |
1 per ~300 words |
| Animated GIF | ffmpeg from video or ImageMagick from frames | UI demos, flow previews |
| Audio narration | kokoro-tts / Edge TTS / ElevenLabs | If mp3 in media targets |
| Video composition | Remotion + AI clips (Veo 3.1) | If mp4 in media targets |
| Instagram carousel PNGs | /pencil MCP |
If Instagram in platforms |
Media Prompt Generation
For each planned asset, generate a specific AI prompt in media/image-prompts.md:
- Describe the visual concept tied to the content it accompanies
- Include style direction (dark theme, technical, minimal, etc.)
- Specify dimensions and aspect ratio per platform
Audio Script
If audio is targeted, extract the post body text and write a narration-ready script in media/audio-script.md. Strip markdown formatting, add natural pauses, and note pronunciation guides for technical terms.
Video Script
If video is targeted, write a Remotion-compatible composition outline in media/video-script.md:
- Scene breakdown (title, stats, screenshots, workflow, closing)
- Duration per scene
- Transition style
- Asset references (which images/clips to use)
Output: media/ directory with prompt files and any generated assets
Phase 7: Strategy & Distribution Planning
Generate strategy documents for the content package.
Output files in strategy/:
audience.md— Target audience profile, what they care about, where they areplatform-strategy.md— Per-platform approach, posting time, format rationaledistribution-plan.md— Publishing sequence (which platform first, timing gaps, cross-linking)cta.md— Call-to-action strategy aligned across all channels
Distribution Sequencing
Recommended order (adjust per strategy):
- Blog post first (canonical URL)
- X thread within 1 hour (drives initial engagement)
- LinkedIn same day (professional audience, different peak hours)
- Instagram carousel next day (visual audience, different consumption pattern)
- Instagram reel 2-3 days later (extends content lifecycle)
- X post (standalone) as engagement trigger mid-week
Phase 8: Publishing & Distribution
Execute the distribution plan by publishing content to each platform. Uses CLI tools and REST APIs — no third-party services.
Platform Connectors
| Platform | Tool | Auth | Capabilities |
|---|---|---|---|
| X/Twitter | xurl CLI |
OAuth2 (configured via xurl auth oauth2) |
Post, thread, reply, media upload, like, repost |
curl + REST API |
OAuth2 bearer token | Text posts, image posts, document carousels | |
curl + Meta Graph API |
Business account + access token | Photo posts, carousel posts, reel uploads | |
| broomva.tech | cp + git + gh |
Git credentials | Copy .mdx + assets, create PR |
X Publishing (via xurl)
Prerequisite check: xurl whoami — if 401, prompt user to run xurl auth oauth2.
Single post:
# Text only
xurl post "$(cat x-post.md | head -1)"
# With image
xurl post "$(cat x-post.md | head -1)" --media media/thumbnails/x-card.png
Thread (parse x-thread.md, post sequentially):
# Extract tweet 1 (the hook), post it, capture the tweet ID
FIRST_ID=$(xurl post "Tweet 1 text" --media media/png/hero.png 2>&1 | jq -r '.data.id')
# Reply chain for remaining tweets
xurl reply $FIRST_ID "Tweet 2 text"
# ... continue for each tweet
Thread parsing logic: Read x-thread.md, split on ### N/N headers, extract text between headers, identify 📸 Image: lines for media attachment. See references/publishing-automation.md.
LinkedIn Publishing (via curl)
Prerequisite: OAuth2 access token stored in ~/.config/blog-post/linkedin-token.
LINKEDIN_TOKEN=$(cat ~/.config/blog-post/linkedin-token)
LINKEDIN_URN=$(cat ~/.config/blog-post/linkedin-urn)
# Uses Posts API v2 (ugcPosts was deprecated in 2024)
curl -s -X POST "https://api.linkedin.com/v2/posts" \
-H "Authorization: Bearer $LINKEDIN_TOKEN" \
-H "Content-Type: application/json" \
-H "LinkedIn-Version: 202401" \
-H "X-Restli-Protocol-Version: 2.0.0" \
-d "{
\"author\": \"urn:li:person:$LINKEDIN_URN\",
\"commentary\": \"$(cat linkedin-post.md | sed '1,2d' | head -40)\",
\"visibility\": \"PUBLIC\",
\"distribution\": { \"feedDistribution\": \"MAIN_FEED\" },
\"lifecycleState\": \"PUBLISHED\"
}"
Instagram Publishing (via Meta Graph API)
Prerequisite: Business/Creator account, access token in ~/.config/blog-post/instagram-token.
IG_TOKEN=$(cat ~/.config/blog-post/instagram-token)
IG_USER_ID=$(cat ~/.config/blog-post/instagram-user-id)
# Step 1: Create media container (image must be publicly hosted)
CONTAINER_ID=$(curl -s -X POST \
"https://graph.instagram.com/v19.0/$IG_USER_ID/media" \
-d "image_url=https://broomva.tech/images/writing/{slug}/hero.png" \
-d "caption=$(cat instagram-post.md | sed -n '/^## Caption/,$ p' | tail -n+2)" \
-d "access_token=$IG_TOKEN" | jq -r '.id')
# Step 2: Publish
curl -s -X POST \
"https://graph.instagram.com/v19.0/$IG_USER_ID/media_publish" \
-d "creation_id=$CONTAINER_ID" \
-d "access_token=$IG_TOKEN"
broomva.tech Publishing
SLUG="{slug}"
# Copy post and assets
cp broomva-tech-post.mdx ~/broomva/broomva.tech/apps/chat/content/writing/$SLUG.mdx
mkdir -p ~/broomva/broomva.tech/apps/chat/public/images/writing/$SLUG/
cp media/png/* ~/broomva/broomva.tech/apps/chat/public/images/writing/$SLUG/
# Copy audio if exists
[ -f media/mp3/narration.mp3 ] && \
cp media/mp3/narration.mp3 ~/broomva/broomva.tech/apps/chat/public/audio/writing/$SLUG.mp3
# Create PR
cd ~/broomva/broomva.tech
git checkout -b content/$SLUG
git add apps/chat/content/writing/$SLUG.mdx apps/chat/public/images/writing/$SLUG/
git commit -m "content: add $SLUG"
git push -u origin content/$SLUG
gh pr create --title "content: $SLUG" --body "New blog post"
Publishing Workflow
When the user says "publish" or "distribute" after a content package is ready:
- Check available connectors — Run
xurl whoami, check for LinkedIn/IG tokens - Report what can be published — List platforms with ✅ (ready) or ❌ (needs setup)
- Confirm with user — Show what will be posted to each platform, ask for go-ahead
- Execute in sequence — Follow the distribution plan order
- Report results — Show post URLs/IDs for each platform, note any failures
- Update README.md — Mark published platforms with URLs
Credential Storage
Store platform tokens in ~/.config/blog-post/ (gitignored, never committed):
~/.config/blog-post/
├── linkedin-token # LinkedIn OAuth2 access token
├── linkedin-urn # LinkedIn member URN
├── instagram-token # Meta/Instagram access token
└── instagram-user-id # Instagram Business account ID
X credentials are managed by xurl internally (stored in its own keychain).
Graceful Degradation
- No xurl auth? → Generate post text but skip publishing; show
xurl auth oauth2instructions - No LinkedIn token? → Generate post but skip; show OAuth setup steps
- No Instagram token? → Generate post but skip; show Meta app setup steps
- Always confirm before posting — Never auto-publish without explicit user approval
Output Structure
Each invocation creates a package at /broomva/posts/{YYYY-MM-DD}-{slug}/:
{YYYY-MM-DD}-{slug}/
├── README.md # Package manifest (what's inside, status, links)
├── brief.md # Content brief (input)
├── research.md # Research notes (if applicable)
├── outline.md # Content outline with angle + framework
├── broomva-tech-post.mdx # Primary long-form (broomva.tech)
├── substack-post.md # Alternative long-form (if requested)
├── x-blog-post.md # X long-form article (multimedia-rich)
├── x-post.md # X single post
├── x-thread.md # X thread (5-8 tweets)
├── linkedin-post.md # LinkedIn post
├── instagram-post.md # Instagram caption + carousel spec
├── instagram-reel.md # Reel script/concept
├── media/
│ ├── image-prompts.md # AI image generation prompts
│ ├── audio-script.md # TTS narration script
│ ├── video-script.md # Video composition script
│ ├── gif-concept.md # GIF animation concept
│ ├── hero.png # Hero/social card (generated)
│ ├── thumbnails/ # Per-platform thumbnails
│ ├── png/ # Static images
│ ├── gif/ # Animated GIFs
│ ├── mp3/ # Audio narration
│ └── mp4/ # Video files
└── strategy/
├── audience.md # Target audience profile
├── platform-strategy.md # Per-platform approach
├── distribution-plan.md # Publishing schedule + sequence
└── cta.md # Call-to-action strategy
Agent Behavior
On Invocation
- Parse intent — Extract topic, audience, intent from user message
- Check brief completeness — If only topic provided, propose defaults and confirm
- Create output directory —
mkdir -p /broomva/posts/{date}-{slug}/media/{thumbnails,png,gif,mp3,mp4} /broomva/posts/{date}-{slug}/strategy - Execute phases 0-7 sequentially — Each phase produces its output file
- Generate media assets — Use available tools (Nano Banana, ffmpeg, kokoro-tts). If tools unavailable, leave prompt files for manual generation
- Copy to broomva.tech — If destination is broomva-tech, also copy
.mdxtobroomva.tech/apps/chat/content/writing/{slug}.mdxand images tobroomva.tech/apps/chat/public/images/writing/{slug}/ - Publish (Phase 8) — If user says "publish" or "distribute", execute the distribution plan via
xurl(X),curl(LinkedIn/Instagram), andgit(broomva.tech). Always confirm before posting. - Report — Summarize what was created, what was published (with URLs), what needs manual action
Graceful Degradation
- No GEMINI_API_KEY? → Generate image prompts but skip generation; note in README
- No ffmpeg/Remotion? → Write video/GIF scripts but skip rendering; note in README
- No TTS engine? → Write audio script but skip narration; note in README
- Never fail silently — Always explain what was skipped and why
Quality Gates
Before completing, validate:
- Every platform adaptation has a unique hook (not copy-pasted)
- Long-form post has at least 3 media placement points
- X thread has 5-8 tweets with images planned every 2-3 tweets
- Instagram carousel has cover + 8-12 content slides specified
- LinkedIn hook is ≤ 210 characters
- CTA is consistent across channels but adapted per platform
- All file paths in README match actual files created
- No placeholder text remains in any output file
See references/quality-checklist.md for the full validation checklist.
Reel Production Quality Gates
When producing Instagram Reels (via Veo 3.1 + ffmpeg):
- Hook grabs attention in first 3 seconds (visual movement, NOT just text)
- Subtitles burned in (80% watch muted)
- No static shot longer than 5 seconds
- Audio present (narration, ambient, or music — never silence)
- CTA in final 3 seconds
- 9:16 vertical,
-movflags +faststart - Duration 15-45 seconds
See references/reel-production.md for Veo 3.1 prompting (5-part formula, camera vocabulary), subtitle generation, and the full production pipeline.
Self-Evolution
This skill improves with every use. See references/self-evolution.md for the full protocol.
After every publish: Track which hooks, formats, and timings performed best. Promote winners to templates. Annotate losers.
Feedback loop: PUBLISH → MEASURE (48h) → EXTRACT PATTERNS → UPDATE SKILL → NEXT PUBLISH
X growth tracking: Track followers/week, impressions/post, thread completion rate, engagement rate, and reply engagement from watchlist accounts. See references/x-growth-strategy.md for full metrics.
Content pillars: Build Logs, Agent Architecture, Meta-Content, Open Source, Contrarian Takes. Each pillar has an optimal platform mix and X-first format.
Compounding: New skills are integrated when they handle a task the pipeline currently does manually, have 100+ community installs, and don't bloat SKILL.md beyond 600 lines.
Quick Start
User: /blog-post "Building an Agent OS in Rust" — targeting developers,
intent is to educate and attract contributors, provocative tone
Agent: [Creates brief → researches if needed → selects ABT angle →
outlines → writes long-form → adapts for X/LinkedIn/IG →
generates media + reels via Veo 3.1 → publishes via xurl/curl/git]