Skip to content

How I Solved a 9-Year Social Media Problem with AI Agents

Problem

For 9 years, I couldn’t maintain a consistent social media presence for my business. I knew I should post. I had ideas. But between running the business and everything else, Twitter/X always fell to the bottom of my priority list.

My timeline looked like this:

My Social Media History
Year 1: Posted 3 times, gave up
Year 2: Hired intern, they left, stopped posting
Year 3: Tried scheduling tools, forgot to add content
Year 4: Paid agency, too expensive, cancelled
Year 5-8: Sporadic bursts, then silence
Year 9: 12 posts total for the entire year

Every “solution” required my time. And I didn’t have time. That was the core problem.

My First Attempt: Scheduling Tools

I tried Buffer, Hootsuite, Later. They all had the same issue: they’re just schedulers. I still had to write the content.

The Problem with Schedulers
+------------------+ +-------------------+ +------------------+
| I write content | --> | Schedule it | --> | Post goes live |
| (30 min/day) | | (2 min) | | (automatic) |
+------------------+ +-------------------+ +------------------+
^
|
THE BOTTLENECK
I still have to write!

The bottleneck wasn’t scheduling. It was content creation.

My Second Attempt: AI Writing Tools

I tried ChatGPT and Claude for content. But I ran into new problems:

My ChatGPT Workflow
Me: "Write a tweet about our new product"
ChatGPT: "Excited to announce our revolutionary new product that will transform your workflow! [link] #innovation #disruption"
Me: "That sounds like marketing speak"
ChatGPT: "Check out our new product! It's great! [link]"
Me: "Too generic"
ChatGPT: "We built something new. We think you'll like it. [link]"

Three problems emerged:

  1. No consistency: Every post had a different tone
  2. No images: I still had to create visuals
  3. No scheduling: I had to manually post each one

I was spending 15 minutes per post just iterating on the AI output. That’s still 30 minutes for two posts a day.

My Third Attempt: AI Agents with Brand Voice

I realized I needed to give the AI my brand voice upfront, not iterate on every post.

brand_voice.py
BRAND_VOICE = {
"tone": "professional but approachable",
"personality": "helpful expert, not salesperson",
"humor": "light, occasional, never forced",
"emoji_usage": "1-2 max, only when natural",
"hashtag_strategy": "2-3 relevant hashtags, never trending spam",
"avoid": [
"revolutionary", "game-changing", "disrupt",
"excited to announce", "thrilled to share",
"you won't believe", "must-have"
],
"preferred_phrases": [
"Here's what we learned",
"Quick tip:",
"We noticed that",
"Turns out"
]
}

This helped. But I still had to generate images and schedule posts.

The Complete Solution: AI Agent Pipeline

I built an agent that handles everything from topic to scheduled post:

Complete Pipeline
+------------+ +---------------+ +---------------+ +------------+
| Topics | --> | Content Gen | --> | Image Gen | --> | Approval |
| (input) | | (AI) | | (AI) | | (me) |
+------------+ +---------------+ +---------------+ +------------+
|
v
+---------------+
| Scheduled |
| Posting |
+---------------+

Here’s the core configuration:

social_media_agent.py
from dataclasses import dataclass
from typing import Optional
import json
@dataclass
class Post:
text: str
image_prompt: str
image_url: Optional[str]
scheduled_time: str
status: str # "draft", "pending_approval", "approved", "posted"
class SocialMediaAgent:
def __init__(self):
self.brand_voice = {
"tone": "professional but approachable",
"humor_level": "light",
"emoji_usage": "minimal",
"hashtag_strategy": "2-3 relevant hashtags"
}
self.content_sources = [
"industry_news",
"company_updates",
"educational_tips",
"behind_the_scenes"
]
self.posting_schedule = {
"frequency": 2, # posts per day
"times": ["09:00", "17:00"],
"timezone": "America/New_York"
}
def generate_post(self, topic: str, date: str) -> Post:
"""Generate a complete post with text and image prompt"""
# Generate text in brand voice
text = self._generate_text(topic)
# Generate image prompt
image_prompt = self._generate_image_prompt(topic, text)
# Assign scheduled time
scheduled_time = self._assign_time(date)
return Post(
text=text,
image_prompt=image_prompt,
image_url=None,
scheduled_time=scheduled_time,
status="draft"
)
def _generate_text(self, topic: str) -> str:
"""Generate post text in brand voice"""
# This would call your LLM of choice
prompt = f"""Write a Twitter/X post about: {topic}
Brand voice guidelines:
- Tone: {self.brand_voice['tone']}
- Humor: {self.brand_voice['humor_level']}
- Use 1-2 emojis max, only if natural
- Include 2-3 relevant hashtags
- Avoid marketing speak: "revolutionary", "game-changing", "excited to announce"
- Preferred phrases: "Here's what we learned", "Quick tip:", "Turns out"
Keep it under 280 characters. Be helpful, not salesy."""
# LLM call would go here
return self._call_llm(prompt)
def _generate_image_prompt(self, topic: str, text: str) -> str:
"""Generate image prompt matching the post"""
prompt = f"""Create an image prompt for a social media post.
Post text: {text}
Topic: {topic}
Image style:
- Minimal, clean design
- Brand colors: navy blue and white
- No text in image (text is in post)
- Professional, not stock photo look
Output just the image prompt, nothing else."""
return self._call_llm(prompt)
def _assign_time(self, date: str) -> str:
"""Assign posting time based on schedule"""
# Rotate through scheduled times
# This is simplified - real implementation would track which time slot
return f"{date}T{self.posting_schedule['times'][0]}:00"
def _call_llm(self, prompt: str) -> str:
"""Call LLM API - implementation depends on your choice"""
# Placeholder - implement with your preferred LLM
pass

The Approval Workflow

The key insight: I don’t want AI posting without my review. Here’s my approval system:

approval_workflow.py
def process_daily_posts(posts: list[Post]) -> dict:
"""Process posts through approval workflow"""
results = {
"approved": [],
"needs_edit": [],
"rejected": []
}
for post in posts:
# Auto-check for issues
issues = validate_post(post)
if issues:
post.status = "needs_edit"
results["needs_edit"].append({
"post": post,
"issues": issues
})
else:
post.status = "pending_approval"
results["approved"].append(post)
return results
def validate_post(post: Post) -> list[str]:
"""Check for common issues"""
issues = []
# Check length
if len(post.text) > 280:
issues.append(f"Post too long: {len(post.text)} chars")
# Check for forbidden phrases
forbidden = ["revolutionary", "game-changing", "excited to announce"]
for phrase in forbidden:
if phrase.lower() in post.text.lower():
issues.append(f"Contains forbidden phrase: {phrase}")
# Check hashtag count
hashtag_count = post.text.count("#")
if hashtag_count > 4:
issues.append(f"Too many hashtags: {hashtag_count}")
return issues

My Daily Workflow Now

Before vs After
BEFORE (30+ min/day):
- Think of topics (10 min)
- Write content (15 min)
- Create/find images (10 min)
- Schedule posts (5 min)
AFTER (5 min/day):
- Open approval dashboard
- Review 2 posts
- Click approve or edit
- Done

The dashboard shows me:

Daily Approval View
+----------------------------------------------------------+
| Post 1 - Scheduled for 9:00 AM |
| ------------------------------------------------------ |
| "Here's what we learned from 100 customer interviews: |
| People don't want more features. They want fewer |
| things that work better. #product #simplicity" |
| |
| [Image: minimal chart showing feature vs satisfaction] |
| |
| [Approve] [Edit] [Reject] |
+----------------------------------------------------------+

Results After 3 Months

MetricBeforeAfter
Posts per week0-214 (2/day)
Time spent30+ min/day5 min/day
ConsistencySporadic100% on schedule
Engagement rate1.2%2.8%
Followers gained~50/month~200/month

The engagement increase surprised me. Consistent posting at optimal times made a bigger difference than I expected.

What I Learned

1. Brand voice documentation is critical

I spent 2 hours upfront documenting my brand voice. That investment paid off immediately. The AI now writes in my voice without iteration.

2. Approval workflow is non-negotiable

I tried auto-posting for a week. The AI made a tone-deaf joke about a competitor’s outage. Never again. Now every post goes through my 5-second review.

3. Topic rotation prevents repetition

topic_rotation.py
TOPIC_ROTATION = {
"Monday": "industry_news",
"Tuesday": "educational_tips",
"Wednesday": "company_updates",
"Thursday": "behind_the_scenes",
"Friday": "industry_news",
"Saturday": "educational_tips",
"Sunday": "company_updates"
}

This keeps content varied and prevents the AI from posting similar things back-to-back.

4. Images matter more than I thought

Posts with images get 2-3x more engagement. The AI generates simple, clean images that match the post. No more searching stock photo sites.

5. Start with fewer posts

I started with 2 posts/day. Should have started with 1. The approval queue felt overwhelming at first. Once I got comfortable, I increased frequency.

Common Mistakes to Avoid

Mistake vs Solution
+--------------------------------+--------------------------------+
| MISTAKE | SOLUTION |
+--------------------------------+--------------------------------+
| No brand voice docs | Write 1-page voice guide first|
| | |
| Auto-posting without review | Always require approval |
| | |
| Generic topics | Specific topic rotation |
| | |
| Skipping images | Generate images with every post|
| | |
| Too many posts initially | Start with 1/day, build up |
+--------------------------------+--------------------------------+

Summary

A 9-year problem solved by AI agents. The key wasn’t just using AI - it was:

  1. Documenting brand voice so the AI writes consistently
  2. Automating the full pipeline from topic to scheduled post
  3. Keeping human approval to prevent embarrassing posts
  4. Starting small and building the habit

The time savings are real: 30+ minutes per day reduced to 5 minutes of review. But the consistency gain is even more valuable. My social media presence went from “whenever I remember” to “twice daily, every day.”

If you’ve struggled with social media consistency, this approach works. The upfront investment is documenting your brand voice and setting up the pipeline. After that, it’s just 5 minutes a day.

Final Words + More Resources

My intention with this article was to help others share my knowledge and experience. If you want to contact me, you can contact by email: Email me

Here are also the most important links from this article along with some further resources that will help you in this scope:

Oh, and if you found these resources useful, don’t forget to support me by starring the repo on GitHub!

Comments