{"id":"8ac75254-ef72-45b8-aa38-56a26df9d968","shortId":"CBBFcn","kind":"skill","title":"social-post","tagline":"Post to social media platforms using a multi-provider social posting API. Use when you want to post to Twitter, LinkedIn, Instagram, Facebook, TikTok, Threads, or Bluesky. Triggers on \"post to twitter\", \"post to instagram\", \"social media post\", \"share on linkedin\", \"publish to so","description":"# Social Posting Skill\n\nPost to multiple social media platforms via a unified social posting API with automatic provider fallback.\n\n---\n\n## Setup\n\n**Location:** `~/social-posting-api/` (configurable — point to wherever you cloned your posting API)\n\n**Environment:**\n```bash\ncd ~/social-posting-api\nsource venv/bin/activate\n```\n\n**Required env vars in `.env`:**\n- `POSTFORME_API_KEY` - Primary provider ([PostForMe](https://postforme.dev))\n- `LATE_API_KEY` - Fallback provider ([LATE](https://getlate.dev))\n\n> You only need one provider to get started. PostForMe is recommended as the primary.\n\n---\n\n## Quick Commands\n\n### Check Connected Accounts\n```python\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\n\nclient = SocialPostingClient()\nprint(\"Providers:\", client.available_providers)\nfor acc in client.get_accounts():\n    print(f\"  {acc.platform}: {acc.username}\")\n```\n\n### Post Text Only\n```python\nresult = client.post(\n    content=\"Your post content here\",\n    platforms=[\"twitter\", \"linkedin\"]\n)\nprint(f\"Success: {result.success}, Provider: {result.provider}\")\n```\n\n### Post with Images\n```python\nresult = client.post(\n    content=\"Check out these photos!\",\n    platforms=[\"instagram\"],\n    media_urls=[\n        \"https://example.com/image1.jpg\",\n        \"https://example.com/image2.jpg\"\n    ]\n)\n```\n\n### Schedule a Post\n```python\nfrom datetime import datetime\n\nresult = client.post(\n    content=\"Scheduled post\",\n    platforms=[\"linkedin\"],\n    scheduled_for=datetime(2025, 1, 15, 9, 0)  # UTC\n)\n```\n\n---\n\n## Supported Platforms\n\n| Platform | Text Only | With Media | Notes |\n|----------|-----------|------------|-------|\n| Twitter/X | ✅ | ✅ | 280 char limit |\n| LinkedIn | ✅ | ✅ | Best for professional content |\n| Instagram | ❌ | ✅ | **Requires media** |\n| Facebook | ✅ | ✅ | |\n| TikTok | ❌ | ✅ | Video preferred |\n| Threads | ✅ | ✅ | |\n| Bluesky | ✅ | ✅ | |\n| Pinterest | ❌ | ✅ | Requires media |\n| YouTube | ❌ | ✅ | Video only |\n\n---\n\n## Complete Posting Script\n\n```python\n#!/usr/bin/env python\n\"\"\"Post to social media platforms.\"\"\"\n\nimport sys\nsys.path.insert(0, '~/social-posting-api')  # Update this path\n\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv('~/social-posting-api/.env')  # Update this path\n\ndef post_to_social(content: str, platforms: list, media_urls: list = None):\n    \"\"\"Post content to specified platforms.\"\"\"\n    client = SocialPostingClient()\n\n    # Check which platforms are connected\n    accounts = client.get_accounts()\n    connected = [a.platform for a in accounts]\n\n    # Filter to only connected platforms\n    valid_platforms = [p for p in platforms if p in connected]\n\n    if not valid_platforms:\n        print(f\"No connected accounts for: {platforms}\")\n        print(f\"Connected: {connected}\")\n        return None\n\n    # Post\n    result = client.post(\n        content=content,\n        platforms=valid_platforms,\n        media_urls=media_urls\n    )\n\n    if result.success:\n        print(f\"✅ Posted via {result.provider}\")\n        print(f\"   Post ID: {result.post_id}\")\n    else:\n        print(f\"❌ Failed: {result.error}\")\n\n    return result\n```\n\n---\n\n## Workflow for Posting\n\n### Step 1: Check Connected Accounts\n\nAlways check what's connected first:\n```bash\ncd ~/social-posting-api\nsource venv/bin/activate && python -c \"\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\nclient = SocialPostingClient()\nfor acc in client.get_accounts():\n    print(f'{acc.platform}: {acc.username}')\n\"\n```\n\n### Step 2: Prepare Content\n\n- **Twitter**: Keep under 280 chars\n- **LinkedIn**: Can be longer, professional tone\n- **Instagram**: Needs at least 1 image\n- **Xiaohongshu**: Use `xhs-image-gen` skill for carousel content\n\n### Step 3: Execute Post\n\n```bash\nsource venv/bin/activate && python -c \"\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\n\nclient = SocialPostingClient()\nresult = client.post(\n    content='''Your content here''',\n    platforms=['platform1', 'platform2'],\n    media_urls=['https://example.com/image.jpg']  # Optional\n)\nprint(f'Success: {result.success}')\nprint(f'Provider: {result.provider}')\nprint(f'Post ID: {result.post_id}')\n\"\n```\n\n---\n\n## Connecting New Accounts\n\n### Via PostForMe (Primary)\n1. Go to https://postforme.dev/dashboard\n2. Click \"Connect Account\"\n3. Select platform and authorize\n\n### Via LATE (Fallback)\n1. Go to https://getlate.dev/dashboard\n2. Connect social accounts\n3. API key in `.env` will auto-detect new accounts\n\n---\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| \"No connected accounts\" | Platform not linked | Connect via provider dashboard |\n| \"Instagram requires media\" | Text-only post | Add at least 1 image URL |\n| \"HTTP 401\" | Invalid API key | Check `.env` file |\n| \"All providers failed\" | Both providers down | Try again later |\n\n---\n\n## Cross-Posting Strategy\n\n**For open source announcements:**\n```python\nresult = client.post(\n    content=\"🚀 Just open-sourced my project!\\n\\nGitHub: https://github.com/yourusername/your-repo\",\n    platforms=[\"twitter\", \"linkedin\"]\n)\n```\n\n**For visual content:**\n```python\n# Multi-image post\nresult = client.post(\n    content=\"Behind the scenes 🔧\",\n    platforms=[\"instagram\"],\n    media_urls=[\n        \"https://example.com/image1.jpg\",\n        \"https://example.com/image2.jpg\",\n    ]\n)\n```","tags":["social","post","claude","agent","skills","phy041","agent-skills","ai-agents","automation","founder","indie-hacker","openclaw"],"capabilities":["skill","source-phy041","skill-social-post","topic-agent-skills","topic-ai-agents","topic-automation","topic-claude","topic-founder","topic-indie-hacker","topic-openclaw","topic-social-media"],"categories":["claude-agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/PHY041/claude-agent-skills/social-post","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add PHY041/claude-agent-skills","source_repo":"https://github.com/PHY041/claude-agent-skills","install_from":"skills.sh"}},"qualityScore":"0.456","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 13 github stars · SKILL.md body (5,418 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T13:03:32.596Z","embedding":null,"createdAt":"2026-04-19T00:41:12.790Z","updatedAt":"2026-04-22T13:03:32.596Z","lastSeenAt":"2026-04-22T13:03:32.596Z","tsv":"'/dashboard':520,538 '/image.jpg'']':493 '/image1.jpg':189,645 '/image2.jpg':192,648 '/social-posting-api':70,83,264,398 '/social-posting-api/.env':280 '/usr/bin/env':253 '/yourusername/your-repo':621 '0':215,263 '1':212,386,445,515,533,579 '15':213 '2':427,521,539 '2025':211 '280':226,433 '3':458,525,543 '401':583 '9':214 'a.platform':312 'acc':144,418 'acc.platform':150,424 'acc.username':151,425 'account':123,147,308,310,316,341,389,421,511,524,542,553,561 'add':576 'alway':390 'announc':606 'api':16,63,79,92,99,544,585 'author':529 'auto':550 'auto-detect':549 'automat':65 'bash':81,396,461 'behind':636 'best':230 'blueski':31,242 'c':402,465 'carousel':455 'caus':557 'cd':82,397 'char':227,434 'check':121,179,303,387,391,587 'click':522 'client':137,301,415,478 'client.available':141 'client.get':146,309,420 'client.post':157,177,202,352,481,609,634 'clone':76 'command':120 'complet':249 'configur':71 'connect':122,307,311,320,332,340,346,347,388,394,509,523,540,560,565 'content':158,161,178,203,233,288,297,353,354,429,456,482,484,610,627,635 'cross':600 'cross-post':599 'dashboard':568 'datetim':198,200,210 'def':284 'detect':551 'dotenv':131,134,136,274,277,279,409,412,414,472,475,477 'els':375 'env':87,90,547,588 'environ':80 'error':554,556 'example.com':188,191,492,644,647 'example.com/image.jpg'']':491 'example.com/image1.jpg':187,643 'example.com/image2.jpg':190,646 'execut':459 'f':149,167,338,345,365,370,377,423,496,500,504 'facebook':27,237 'fail':378,592 'fallback':67,101,532 'file':589 'filter':317 'first':395 'gen':452 'get':111 'getlate.dev':104,537 'getlate.dev/dashboard':536 'github.com':620 'github.com/yourusername/your-repo':619 'go':516,534 'handl':555 'http':582 'id':372,374,506,508 'imag':174,446,451,580,631 'import':128,132,199,260,271,275,406,410,469,473 'instagram':26,39,184,234,441,569,640 'invalid':584 'keep':431 'key':93,100,545,586 'late':98,103,531 'later':598 'least':444,578 'limit':228 'link':564 'linkedin':25,45,165,207,229,435,624 'list':291,294 'load':133,135,276,278,411,413,474,476 'locat':69 'longer':438 'media':7,41,56,185,223,236,245,258,292,358,360,489,571,641 'multi':12,630 'multi-imag':629 'multi-provid':11 'multipl':54 'n':617 'need':107,442 'new':510,552 'ngithub':618 'none':295,349 'note':224 'one':108 'open':604,613 'open-sourc':612 'option':494 'p':324,326,330 'path':267,283 'photo':182 'pinterest':243 'platform':8,57,163,183,206,218,219,259,290,300,305,321,323,328,336,343,355,357,486,527,562,622,639 'platform1':487 'platform2':488 'point':72 'post':3,4,15,22,34,37,42,50,52,62,78,127,152,160,172,195,205,250,255,270,285,296,350,366,371,384,405,460,468,505,575,601,632 'postform':91,96,113,513 'postforme.dev':97,519 'postforme.dev/dashboard':518 'prefer':240 'prepar':428 'primari':94,118,514 'print':139,148,166,337,344,364,369,376,422,495,499,503 'profession':232,439 'project':616 'provid':13,66,95,102,109,140,142,170,501,567,591,594 'publish':46 'python':124,155,175,196,252,254,401,464,607,628 'quick':119 'recommend':115 'requir':86,235,244,570 'result':156,176,201,351,381,480,608,633 'result.error':379 'result.post':373,507 'result.provider':171,368,502 'result.success':169,363,498 'return':348,380 'scene':638 'schedul':193,204,208 'script':251 'select':526 'setup':68 'share':43 'skill':51,453 'skill-social-post' 'social':2,6,14,40,49,55,61,126,257,269,287,404,467,541 'social-post':1 'socialpostingcli':129,138,272,302,407,416,470,479 'solut':558 'sourc':84,399,462,605,614 'source-phy041' 'specifi':299 'start':112 'step':385,426,457 'str':289 'strategi':602 'success':168,497 'support':217 'sys':261 'sys.path.insert':262 'text':153,220,573 'text-on':572 'thread':29,241 'tiktok':28,238 'tone':440 'topic-agent-skills' 'topic-ai-agents' 'topic-automation' 'topic-claude' 'topic-founder' 'topic-indie-hacker' 'topic-openclaw' 'topic-social-media' 'tri':596 'trigger':32 'twitter':24,36,164,430,623 'twitter/x':225 'unifi':60 'updat':265,281 'url':186,293,359,361,490,581,642 'use':9,17,448 'utc':216 'valid':322,335,356 'var':88 'venv/bin/activate':85,400,463 'via':58,367,512,530,566 'video':239,247 'visual':626 'want':20 'wherev':74 'workflow':382 'xhs':450 'xhs-image-gen':449 'xiaohongshu':447 'youtub':246","prices":[{"id":"70f0f295-3bc3-4ba8-991d-adbeb3150e44","listingId":"8ac75254-ef72-45b8-aa38-56a26df9d968","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"PHY041","category":"claude-agent-skills","install_from":"skills.sh"},"createdAt":"2026-04-19T00:41:12.790Z"}],"sources":[{"listingId":"8ac75254-ef72-45b8-aa38-56a26df9d968","source":"github","sourceId":"PHY041/claude-agent-skills/social-post","sourceUrl":"https://github.com/PHY041/claude-agent-skills/tree/main/skills/social-post","isPrimary":false,"firstSeenAt":"2026-04-19T00:41:12.790Z","lastSeenAt":"2026-04-22T13:03:32.596Z"}],"details":{"listingId":"8ac75254-ef72-45b8-aa38-56a26df9d968","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"PHY041","slug":"social-post","github":{"repo":"PHY041/claude-agent-skills","stars":13,"topics":["agent-skills","ai-agents","automation","claude","founder","indie-hacker","openclaw","social-media"],"license":null,"html_url":"https://github.com/PHY041/claude-agent-skills","pushed_at":"2026-02-24T15:25:20Z","description":"Collection of Claude Code Agent Skills for founders, indie hackers, and growth engineers","skill_md_sha":"35ce2e59ce63fd2f610d3878d38f478f6864d5d3","skill_md_path":"skills/social-post/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/PHY041/claude-agent-skills/tree/main/skills/social-post"},"layout":"multi","source":"github","category":"claude-agent-skills","frontmatter":{"name":"social-post","description":"Post to social media platforms using a multi-provider social posting API. Use when you want to post to Twitter, LinkedIn, Instagram, Facebook, TikTok, Threads, or Bluesky. Triggers on \"post to twitter\", \"post to instagram\", \"social media post\", \"share on linkedin\", \"publish to social\", or any social posting request."},"skills_sh_url":"https://skills.sh/PHY041/claude-agent-skills/social-post"},"updatedAt":"2026-04-22T13:03:32.596Z"}}