Install
openclaw skills install social-media-platformBuild a plugin-based social media management platform with multi-platform publishing, content calendar, brand voices, AI content generation via LangGraph, and analytics. Use when building social media tools, content scheduling systems, or multi-platform publishing pipelines. Covers Facebook, Instagram, YouTube, Twitter/X, TikTok integration patterns.
openclaw skills install social-media-platformBuild a complete social media management system with plugin architecture, AI-powered content generation, and multi-platform publishing.
┌─────────────────────────────────────┐
│ Frontend (5 pages) │
│ Dashboard│Compose│Calendar│Analytics│Settings│
├─────────────────────────────────────┤
│ API Layer (FastAPI) │
│ Posts CRUD│Publishing│Calendar│AI │
├─────────────────────────────────────┤
│ Plugin Registry (per-platform) │
│ Twitter│Instagram│YouTube│FB│TikTok│Manual│
├─────────────────────────────────────┤
│ LangGraph Content Pipeline │
│ Voice→Research→Draft→Optimize→Save │
├─────────────────────────────────────┤
│ Supabase (6 tables) │
└─────────────────────────────────────┘
Create 6 tables:
social_posts — id, platform, content, status (draft/scheduled/published/failed), media_urls, published_at, post_url, engagement_metrics (JSONB)platform_connections — id, platform, account_name, credentials (JSONB), status, scopescontent_calendar — id, post_id (FK), scheduled_for, platform, statusbrand_voices — id, name, description, tone, example_phrases (JSONB array), is_defaultsocial_analytics — id, post_id (FK), platform, impressions, clicks, likes, shares, comments, fetched_atpublish_queue — id, post_id (FK), platform, status, retry_count, error_messageSeed 3-5 brand voices. Example voices:
Base class pattern:
class SocialPlugin:
platform: str
def validate_credentials(self, creds: dict) -> bool
def publish(self, content: str, media_urls: list = None) -> dict
def get_analytics(self, post_id: str) -> dict
def format_content(self, content: str, max_length: int) -> str
class PluginRegistry:
_plugins: dict[str, SocialPlugin] = {}
def register(self, plugin: SocialPlugin)
def get(self, platform: str) -> SocialPlugin
def list_active(self) -> list[str]
Platform-specific implementations:
/{page_id}/feed./{ig_user_id}/media → /{ig_user_id}/media_publish. Image required.6-node graph:
load_voice → research_context → generate_drafts → optimize_per_platform → finalize → END
social_posts as draft statusCore routes (~19 endpoints):
GET/POST /api/social/posts — CRUDPOST /api/social/posts/{id}/publish — publish to selected platformsGET/POST /api/social/calendar — calendar view + schedulingGET /api/social/analytics — aggregated metricsGET/POST /api/social/voices — brand voice managementGET/POST /api/social/connections — platform credentialsPOST /api/social/generate — AI content generation (triggers LangGraph)5 pages with shared dark-theme shell (sidebar nav, top bar):
credentials JSONB column