Writing a blog post takes hours. Reformatting it for LinkedIn takes 30 minutes. Breaking it into tweets takes another 20. Drafting the newsletter version takes 45. By the time you've cross-posted it everywhere, you've spent more time on distribution than you did on the original writing. This guide shows you how to write once and have an AI generate five platform-ready pieces in under two minutes — a LinkedIn post, a Twitter/X thread, an email newsletter, a YouTube description, and a short recap you can use anywhere. Thirty minutes to set up, then it works every time.
You drop in a blog post — the full text, pasted into a script — and it generates all five of these:
Running this pipeline on 12 consecutive posts over 6 weeks, the LinkedIn and email outputs needed edits about 30% of the time — usually just adjusting the tone or tweaking the hook. The Twitter threads and short recap were usable as-is 90% of the time. Total review time per post: 12 minutes on average, down from 2+ hours.
.txt file, or paste it directly at the prompt. That's it.No accounts to connect. No Zapier. No OAuth flow. You run the script, get five text files, paste the content where it needs to go.
Go to platform.openai.com → API Keys → Create new key. Copy it. You'll paste it into the script's config block. If you've never added billing, do that now — add $5 and it'll last you months at this usage level.
Make a new folder called content-repurposer anywhere on your computer. Inside it, create a file called repurpose.py and paste the script from the section below. Fill in your API key and your name/brand in the config block at the top. That's the only setup required.
Open your terminal, navigate to the folder (cd ~/content-repurposer), and run: pip install openai. If you already have it from another project, this is instant. If not, it takes about 10 seconds.
Paste the full text of your blog post into a file called post.txt in the same folder. Then run: python3 repurpose.py post.txt. In about 20–30 seconds, five files appear in an output/ folder: linkedin.txt, twitter-thread.txt, email-newsletter.txt, youtube-description.txt, and short-recap.txt. Open, review, and publish.
In the config block, there's a VOICE_NOTES field. This is where you tell the AI how you write. A sentence or two is enough: "Direct and practical. No corporate speak. Short sentences. First-person." The more specific you are, the less editing the output needs. This is the biggest lever for improving output quality.
Paste this into repurpose.py. The only things you need to change are in the CONFIG block at the top.
#!/usr/bin/env python3
# repurpose.py
# Usage: python3 repurpose.py your-post.txt
# Outputs: output/linkedin.txt, output/twitter-thread.txt,
# output/email-newsletter.txt, output/youtube-description.txt,
# output/short-recap.txt
import sys, os
from pathlib import Path
from openai import OpenAI
# ─── CONFIG ────────────────────────────────────────────────────────────────
OPENAI_API_KEY = "sk-..." # Your OpenAI API key
YOUR_NAME = "Your Name" # Used in newsletter sign-off
BRAND_NAME = "Your Brand / Business" # Used for context
POST_URL = "https://yourblog.com/post" # Link back to the original post
# How do you write? Be specific. This shapes every output.
VOICE_NOTES = """
Direct and practical. No jargon. Short sentences.
First-person. No filler phrases like 'In conclusion' or 'It's important to note'.
"""
# ───────────────────────────────────────────────────────────────────────────
MODEL = "gpt-4o-mini" # Fast and cheap. Switch to gpt-4o for higher quality.
PROMPTS = {
"linkedin": f"""
You are a content writer for {BRAND_NAME}. Your writing style: {VOICE_NOTES}
Write a LinkedIn post based on the blog post below.
Rules:
- 1,200–1,500 characters total
- Start directly with the core insight — no "Excited to share" or greeting
- 3–5 short paragraphs with line breaks between them
- End with ONE question to encourage comments
- No more than 3 relevant hashtags at the very end
- Do NOT include the title as a header
""",
"twitter-thread": f"""
You are a content writer for {BRAND_NAME}. Your writing style: {VOICE_NOTES}
Write a Twitter/X thread based on the blog post below.
Rules:
- 10–12 tweets
- Each tweet ≤280 characters
- Number them: 1/ 2/ etc.
- Tweet 1: hook — the boldest, most shareable claim from the post
- Tweets 2–9: one clear point per tweet; self-contained (readable out of context)
- Tweet 10: summary tweet that recaps the whole thread in 2 sentences
- Final tweet: "Full post: {POST_URL}"
- Separate each tweet with a blank line
""",
"email-newsletter": f"""
You are a content writer for {BRAND_NAME}. Your writing style: {VOICE_NOTES}
Write an email newsletter edition based on the blog post below.
Rules:
- 500–700 words
- Subject line on the first line, preceded by "Subject: "
- Short intro paragraph (2–3 sentences) — why this matters right now
- 3–4 skimmable sections with short bolded headers
- Conversational tone — written to a single reader, not a crowd
- End with one clear action or next step
- Sign off as {YOUR_NAME}
""",
"youtube-description": f"""
You are a content writer for {BRAND_NAME}. Your writing style: {VOICE_NOTES}
Write a YouTube video description based on the blog post below.
Assume the video covers the same content as the post.
Rules:
- 200–300 words total
- First 150 characters: most compelling hook/summary (this is what shows before "Show more")
- Second paragraph: what viewers will learn (3–5 bullet points)
- Third paragraph: brief about the channel / {BRAND_NAME}
- End with: "Read the full post: {POST_URL}"
- Include 5–8 relevant search keywords naturally in the text
""",
"short-recap": f"""
You are a content writer for {BRAND_NAME}. Your writing style: {VOICE_NOTES}
Write a short recap of the blog post below.
Rules:
- 2–3 sentences maximum
- ≤280 characters total
- Must work standalone — no "In this post..." setup
- Capture the single most useful or surprising insight
- Works as an Instagram caption, Slack message, or pinned tweet
"""
}
def repurpose(post_text: str, output_dir: Path) -> None:
client = OpenAI(api_key=OPENAI_API_KEY)
output_dir.mkdir(parents=True, exist_ok=True)
for format_name, system_prompt in PROMPTS.items():
print(f" Generating {format_name}...", end=" ", flush=True)
response = client.chat.completions.create(
model=MODEL,
messages=[
{"role": "system", "content": system_prompt.strip()},
{"role": "user", "content": f"Here is the blog post:\n\n{post_text}"}
],
temperature=0.7,
)
content = response.choices[0].message.content.strip()
out_file = output_dir / f"{format_name}.txt"
out_file.write_text(content, encoding="utf-8")
print("done.")
print(f"\n✓ All outputs saved to: {output_dir}/")
print(" linkedin.txt")
print(" twitter-thread.txt")
print(" email-newsletter.txt")
print(" youtube-description.txt")
print(" short-recap.txt")
def main():
if len(sys.argv) < 2:
print("Usage: python3 repurpose.py your-post.txt")
print(" python3 repurpose.py (will prompt for file path)")
sys.exit(1)
post_file = Path(sys.argv[1])
if not post_file.exists():
print(f"File not found: {post_file}")
sys.exit(1)
post_text = post_file.read_text(encoding="utf-8").strip()
if len(post_text) < 100:
print("Post seems very short. Make sure you pasted the full text.")
sys.exit(1)
# Output folder named after the input file (without extension)
output_dir = Path("output") / post_file.stem
print(f"\nRepurposing: {post_file.name}")
print(f"Word count: ~{len(post_text.split())} words")
print(f"Output folder: {output_dir}/\n")
repurpose(post_text, output_dir)
if __name__ == "__main__":
main()
Here's an example using a 900-word post about time management. This is what came out with no editing:
The most dangerous productivity advice is "do your most important task first."
It sounds right. It's in every book. But it assumes you have the energy to actually do your most important task at 8am — and most people don't.
Here's what actually works: identify your peak energy window first, then slot your hardest work there. For most people, that's mid-morning or early afternoon, not 6am. The "eat the frog" advice accidentally trained a generation of people to schedule their hardest work during their worst hours.
Three questions to find your actual peak window: When do you naturally stop checking your phone? When does time disappear when you're working? When do your best ideas happen unprompted?
Schedule your real work there. Everything else fills the gaps.
When did you figure out your best work window? Did it surprise you?
#productivity #timemanagement #deepwork
... 7 more tweets
"Eat the frog" schedules your hardest work during your worst hours. Find your actual peak energy window — usually mid-morning or early afternoon — and protect that time for real work. Everything else fills the gaps."
The single biggest factor in output quality is your VOICE_NOTES setting. With a blank voice note, the output is generic but usable. With a specific voice note — even just three sentences about how you write — the output needs much less editing. Spend 5 minutes writing your voice description once. You get it back every run.
These work especially well for Twitter threads — each item in your list becomes a tweet. The LinkedIn output tends to pick the best 2–3 items and build a stronger argument around them rather than listing all seven, which is usually the right call for that platform.
These produce the strongest LinkedIn output because the model has a clear thesis to open with. The Twitter thread sometimes needs a light edit on the hook tweet to make it punchy enough — you'll know immediately if it landed or not.
The email newsletter format shines here because it can follow your step structure naturally. The YouTube description is also very strong for how-to content because it can bullet out the steps clearly. The LinkedIn output sometimes needs the most editing for tutorials — "step 1, step 2" formatting doesn't read well on that platform.
The script handles them fine, but the outputs may feel like they're trying to cover too much ground. For long posts, consider splitting into sections and running each section separately, then combining the outputs. Or add a line to your prompt: "Focus on the section about [topic X] — treat that as the main argument."
The fastest workflow: when you finish writing a post, immediately drop it into post.txt and run the script before you close your laptop. The output files sit in your output folder. When you're ready to post on LinkedIn on Tuesday, open linkedin.txt, give it a 5-minute read, and publish. No reformatting, no staring at a blank box wondering what angle to take.
If you publish on a schedule, you can batch this: write 4 posts on Sunday afternoon, run the script on each, and have 20 pieces of platform-ready content queued up for the week. Then spend Monday morning reviewing them and scheduling them in Buffer or Publer.
The model is gpt-4o-mini by default — fast and very cheap. If you want higher quality outputs (especially for LinkedIn, where the writing bar is higher), change MODEL = "gpt-4o-mini" to MODEL = "gpt-4o". The cost goes from $0.002 to about $0.04 per post. Still under a nickel.
The AI doesn't know what happened last week in your industry, your personal story, or the specific client you're thinking of when you write a post. The output is a strong starting point, not a finished product. Read every piece before you post it. The review takes 5 minutes. Skipping it and posting something off-brand is 100% on you.
The default output without voice notes is technically correct but tonally bland. The model writes in a kind of generic "professional content creator" voice that doesn't sound like anyone. Fill in your voice description before your first real run. You only do it once.
The AI repurposes what you give it. If the source post is unfocused, the outputs will be too. This tool works best on a polished post with a clear thesis. If your draft is still messy, finish the post first, then run the script.
The newsletter output is good, but the intro paragraph is always generic — it doesn't know what was happening in your life, your business, or your industry last week. Add one personal sentence at the top before you send it. Something brief: "This week I shipped X, which got me thinking about Y." That one sentence does more for open rates and replies than anything the AI writes.
~30 minutes (one-time)
~$0.002 (gpt-4o-mini) / ~$0.04 (gpt-4o)
1.5–2 hours of manual reformatting
~12 minutes across all 5 outputs
If you publish twice a week, you're saving 3–4 hours weekly. That's a full workday back every month. At $9/month for Library access, this pays for itself the first time you use it.
Library members get the extended version: prompt variants for 8 post types (listicle, opinion, tutorial, case study, interview, announcement, thread-first, and long-form essay), a Buffer/Publer scheduling integration that auto-queues posts after generation, and voice profile templates for 12 common writing styles to drop in as a starting point.
30-day money-back guarantee. Cancel anytime.