Install
openclaw skills install social-media-autopilotClawHub Security found sensitive or high-impact capabilities. Review the scan results before using.
Schedule, compose, and publish social media posts across X (Twitter), LinkedIn, and Instagram from OpenClaw. Manage a content calendar, queue posts with approval workflows, track engagement analytics, and maintain brand voice consistency. Use when: (1) scheduling or publishing social media posts, (2) managing a content calendar, (3) drafting posts for multiple platforms, (4) reviewing post performance/analytics, (5) setting up automated posting workflows, or (6) maintaining a social media presence.
openclaw skills install social-media-autopilotMulti-platform social media management from your OpenClaw agent. Schedule posts, manage a content calendar, get approval before publishing, and track performance.
Configure in your environment or .env file:
xurl skill or X API v2 credentials (X_BEARER_TOKEN, X_API_KEY, X_API_SECRET, X_ACCESS_TOKEN, X_ACCESS_SECRET)LINKEDIN_ACCESS_TOKEN (OAuth 2.0 — see references/linkedin-setup.md)INSTAGRAM_ACCESS_TOKEN + INSTAGRAM_BUSINESS_ID (Meta Graph API — see references/instagram-setup.md)All content lives in ~/.openclaw/workspace/social-media/:
social-media/
├── calendar.json # Scheduled posts
├── drafts/ # Posts awaiting approval
├── published/ # Archive of sent posts
├── templates/ # Reusable post templates
└── analytics/ # Performance data
Run scripts/init-workspace.sh to create this structure.
To create a post:
scripts/draft-post.sh --platform <x|linkedin|instagram|all> --text "Post content" [--media path/to/image] [--schedule "2026-02-25 09:00 PST"]drafts/ as a JSON file with metadata--schedule is set, it's added to calendar.json--schedule, it queues for immediate reviewDraft JSON format:
{
"id": "uuid",
"platforms": ["x", "linkedin"],
"text": "Post content here",
"media": [],
"scheduled_at": "2026-02-25T17:00:00Z",
"status": "draft",
"created_at": "2026-02-23T22:00:00Z",
"approved": false,
"tags": ["product-launch"],
"thread": false
}
Before any post goes live:
scripts/approve-post.sh <post-id> or scripts/reject-post.sh <post-id> --reason "..."Never auto-publish without explicit approval unless the user has configured auto_approve: true in social-media/config.json.
Run scripts/publish-post.sh <post-id> to publish an approved post.
The script:
published/calendar.json statusPlatform-specific adaptations:
View and manage scheduled content:
scripts/calendar.sh --week — Show this week's schedulescripts/calendar.sh --month — Monthly overviewscripts/calendar.sh --gaps — Find gaps in posting schedulescripts/calendar.sh --reschedule <post-id> "new-datetime" — Move a postPull engagement data for published posts:
scripts/analytics.sh --last 7d — Last 7 days performancescripts/analytics.sh --post <post-id> — Single post performancescripts/analytics.sh --report weekly — Generate weekly reportMetrics tracked: impressions, engagements, clicks, replies, reposts, likes, followers gained.
Store reusable templates in templates/:
{
"name": "product-announcement",
"platforms": ["x", "linkedin"],
"template": "🚀 {product_name} is here!\n\n{description}\n\n{link}\n\n{hashtags}",
"variables": ["product_name", "description", "link", "hashtags"],
"voice_notes": "Excited but professional. No ALL CAPS."
}
When composing posts, reference social-media/brand-voice.md for tone guidelines if it exists.
Add to OpenClaw cron for automated workflows:
calendar.json every 15 min, publish any due approved postsdrafts/ with status: "failed" and error messagereferences/linkedin-setup.md — LinkedIn OAuth setup guidereferences/instagram-setup.md — Instagram/Meta Graph API setup guidereferences/platform-limits.md — Character limits, media specs, rate limits per platform