skills/content-designer/SKILL.md
Generates images for approved social media posts using Gemini API, uploads to Blotato media hosting, stores URLs in Notion, and sets status to Ready. Processes posts at "Approved" status only. Runs on Thursday 3pm cron or manual invocation. Use when the user says "generate images," "process approved posts," "content designer," "create visuals," or wants images generated for approved calendar entries.
npx skillsauth add demtomi/social-media-agent-toolkit content-designerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You generate images for approved social media posts. You read the Media Guide from Notion, generate visuals via Gemini, upload to Blotato hosting, store URLs, and set status to "Ready". You stop at Gate 2.
You do NOT write copy (content-writer does that) or schedule posts (content-distributor does that).
Query the Notion Calendar for posts that need images.
Calendar DB: YOUR_CALENDAR_DB_ID
Filter: Status = "Approved"
Skip these formats entirely:
Tell the user which video posts were skipped and why.
If no "Approved" image/carousel posts are found, report "No posts ready for image generation" and stop.
For each approved post, read the Media Guide property. This contains slide-by-slide descriptions written by the content-writer skill.
If Media Guide is empty, report the post as skipped (missing Media Guide) and continue to the next post.
Script: ./scripts/generate_image.py
Usage:
python3 generate_image.py --prompt "PROMPT" --aspect "RATIO" --output "FILENAME" --model MODEL
| Format | Model | Cost | |---|---|---| | Single Image | flash | ~$0.045/image | | Multi-Image (LinkedIn) | pro | ~$0.134/image | | Carousel (Instagram) | pro | ~$0.134/image |
| Platform | Format | Aspect Ratio | Pixels | |---|---|---|---| | LinkedIn | Single Image | 4:5 | 1440x1800 | | LinkedIn | Multi-Image | 1:1 | 1200x1200 | | Instagram | Single Image | 4:5 | 1080x1350 | | Instagram | Carousel | 4:5 | 1080x1350 |
Each slide description in the Media Guide becomes a generation prompt. Prepend each prompt with the design language:
Create a social media image with these exact specifications:
- Solid {color} background (use your brand palette colors)
- Your brand font, white text
- Modern line icons in Lucide style
- No gradients, no 3D effects, no stock photos, no people illustrations
- Clean, minimal layout with generous whitespace
- {specific slide description from Media Guide}
Color rotation for multi-slide posts: Alternate between your brand colors across slides. Never use the same color for consecutive slides.
Applied automatically by the script (circular headshot + your brand text). Do not include footer instructions in the prompt.
post{ID}-{platform}-{slug}.pngpost{ID}-slide{N}-{slug}.pngpost{ID}-ig-slide{N}-{slug}.pngImmediately after generating images (no pause between generation and upload).
Endpoint: POST https://backend.blotato.com/v2/media
Auth header: blotato-api-key: {key from .env as BLOTATO_API_KEY}
Content-Type: application/json
For local files, use base64 upload via Python:
import base64, requests, os
api_key = os.environ['BLOTATO_API_KEY']
with open('image.png', 'rb') as f:
b64 = base64.b64encode(f.read()).decode()
response = requests.post(
'https://backend.blotato.com/v2/media',
headers={'blotato-api-key': api_key, 'Content-Type': 'application/json'},
json={'url': f'data:image/png;base64,{b64}'}
)
hosted_url = response.json()['url']
Do NOT use curl for base64 uploads (escaping issues with API key containing +).
Update the Visual URL property on the Notion Calendar entry:
STOP HERE. Do not proceed to scheduling. The user reviews images locally and manually moves entries to "Can Be Scheduled" when satisfied.
The user reviews generated images locally (Notion Visual URL only renders the first image for multi-image posts, so local review is necessary).
For each entry:
If entries come back at "Needs Rework":
PROFILE_PHOTO_PATH. If missing, generate without footer and flag it.Track and report costs per run:
Monthly budget reference: ~$12-15/month at full cadence.
| Database | ID |
|---|---|
| Social Media Calendar | YOUR_CALENDAR_DB_ID |
content-writer -- creates copy and Media Guides (runs before this skill)content-distributor -- schedules posts via media host (runs after this skill)content-ideation -- fills the Topic Bank (runs Wed)content-analytics -- measures performance (runs Mon)testing
Automated content writer. Takes topics from the Notion Topic Bank or Calendar and generates platform-specific copy for LinkedIn, Instagram, TikTok, and YouTube using parallel subagents. Handles slot assignment, conflict checking, and Notion status management. Runs on Thursday 9am cron or manual invocation. Use when the user says "write content," "draft posts," "content writer," "write this week's posts," or wants copy generated for social media calendar entries.
development
Scans trend sources via Perplexity API, generates topic ideas, scores them, and pushes to the Notion Topic Bank and Social Media Calendar. Runs on Wednesday 9am cron or manual invocation. Use when the user says "find topics," "content ideation," "what should I post about," "scan for trending topics," "fill the topic bank," or wants fresh content ideas for the week.
development
Schedules social media posts via Blotato API and verifies publishing. Processes posts at "Can Be Scheduled" status only. Handles post creation, status polling, and publish verification. Runs on Friday 9am cron or manual invocation. Use when the user says "schedule posts," "publish posts," "content distributor," "process scheduled," "verify published," or wants posts sent to Blotato for scheduling.
development
Weekly performance analytics. Pulls metrics for published posts, tags top and bottom performers, updates the Topic Bank with success data, and generates an HTML dashboard email. Runs on Monday 9am cron or manual invocation. Use when the user says "content analytics," "weekly report," "how did posts perform," "check analytics," "tag top posts," or wants a performance review of recent social media content.