agentsclimarketplace

Social post

Skill PHY041/claude-agent-skills/skills/social-post

Collection of Claude Code Agent Skills for founders, indie hackers, and growth engineers

Install
npx -y skills add PHY041/claude-agent-skills --skill social-post

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 18 stars18 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

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.

SKILL.md

6.3 KB, as published. Nobody here has run it

Social Posting Skill

Post to multiple social media platforms via a unified social posting API with automatic provider fallback.


Setup

Location: ~/social-posting-api/ (configurable — point to wherever you cloned your posting API)

Environment:

cd ~/social-posting-api
source venv/bin/activate

Required env vars in .env:

  • POSTFORME_API_KEY - Primary provider (PostForMe)
  • LATE_API_KEY - Fallback provider (LATE)

You only need one provider to get started. PostForMe is recommended as the primary.


Quick Commands

Check Connected Accounts

from social_posting import SocialPostingClient
from dotenv import load_dotenv
load_dotenv()

client = SocialPostingClient()
print("Providers:", client.available_providers)
for acc in client.get_accounts():
    print(f"  {acc.platform}: {acc.username}")

Post Text Only

result = client.post(
    content="Your post content here",
    platforms=["twitter", "linkedin"]
)
print(f"Success: {result.success}, Provider: {result.provider}")

Post with Images

result = client.post(
    content="Check out these photos!",
    platforms=["instagram"],
    media_urls=[
        "https://example.com/image1.jpg",
        "https://example.com/image2.jpg"
    ]
)

Schedule a Post

from datetime import datetime

result = client.post(
    content="Scheduled post",
    platforms=["linkedin"],
    scheduled_for=datetime(2025, 1, 15, 9, 0)  # UTC
)

Supported Platforms

PlatformText OnlyWith MediaNotes
Twitter/X280 char limit
LinkedInBest for professional content
InstagramRequires media
Facebook
TikTokVideo preferred
Threads
Bluesky
PinterestRequires media
YouTubeVideo only

Complete Posting Script

#!/usr/bin/env python
"""Post to social media platforms."""

import sys
sys.path.insert(0, '~/social-posting-api')  # Update this path

from social_posting import SocialPostingClient
from dotenv import load_dotenv
load_dotenv('~/social-posting-api/.env')  # Update this path

def post_to_social(content: str, platforms: list, media_urls: list = None):
    """Post content to specified platforms."""
    client = SocialPostingClient()

    # Check which platforms are connected
    accounts = client.get_accounts()
    connected = [a.platform for a in accounts]

    # Filter to only connected platforms
    valid_platforms = [p for p in platforms if p in connected]

    if not valid_platforms:
        print(f"No connected accounts for: {platforms}")
        print(f"Connected: {connected}")
        return None

    # Post
    result = client.post(
        content=content,
        platforms=valid_platforms,
        media_urls=media_urls
    )

    if result.success:
        print(f"✅ Posted via {result.provider}")
        print(f"   Post ID: {result.post_id}")
    else:
        print(f"❌ Failed: {result.error}")

    return result

Workflow for Posting

Step 1: Check Connected Accounts

Always check what's connected first:

cd ~/social-posting-api
source venv/bin/activate && python -c "
from social_posting import SocialPostingClient
from dotenv import load_dotenv
load_dotenv()
client = SocialPostingClient()
for acc in client.get_accounts():
    print(f'{acc.platform}: {acc.username}')
"

Step 2: Prepare Content

  • Twitter: Keep under 280 chars
  • LinkedIn: Can be longer, professional tone
  • Instagram: Needs at least 1 image
  • Xiaohongshu: Use xhs-image-gen skill for carousel content

Step 3: Execute Post

source venv/bin/activate && python -c "
from social_posting import SocialPostingClient
from dotenv import load_dotenv
load_dotenv()

client = SocialPostingClient()
result = client.post(
    content='''Your content here''',
    platforms=['platform1', 'platform2'],
    media_urls=['https://example.com/image.jpg']  # Optional
)
print(f'Success: {result.success}')
print(f'Provider: {result.provider}')
print(f'Post ID: {result.post_id}')
"

Connecting New Accounts

Via PostForMe (Primary)

  1. Go to https://postforme.dev/dashboard
  2. Click "Connect Account"
  3. Select platform and authorize

Via LATE (Fallback)

  1. Go to https://getlate.dev/dashboard
  2. Connect social accounts
  3. API key in .env will auto-detect new accounts

Error Handling

ErrorCauseSolution
"No connected accounts"Platform not linkedConnect via provider dashboard
"Instagram requires media"Text-only postAdd at least 1 image URL
"HTTP 401"Invalid API keyCheck .env file
"All providers failed"Both providers downTry again later

Cross-Posting Strategy

For open source announcements:

result = client.post(
    content="🚀 Just open-sourced my project!\n\nGitHub: https://github.com/yourusername/your-repo",
    platforms=["twitter", "linkedin"]
)

For visual content:

# Multi-image post
result = client.post(
    content="Behind the scenes 🔧",
    platforms=["instagram"],
    media_urls=[
        "https://example.com/image1.jpg",
        "https://example.com/image2.jpg",
    ]
)

Gives 0 of the 12 instructions most social media skills give

Counted across 489 of the 492 authors here whose files we hold, read 2026-08-06

  • build content around three to five pillarsin 24 of 489, across 12 files
  • read product marketing context before asking questionsin 23 of 489, across 13 files
  • respond to all comments on your postsin 21 of 489, across 9 files
  • adapt tone and structure per platformin 18 of 489, across 8 files
  • adapt content for each platformin 15 of 489, across 10 files
  • use the output flag to specify an output directoryin 14 of 489, across 4 files
  • Generate output logo images with white backgroundin 13 of 489, across 4 files
  • Fix failing generation scripts directlyin 13 of 489, across 4 files
  • ask user about html preview after logo generationin 12 of 489, across 3 files
  • run the download script with a URLin 12 of 489, across 3 files
  • implement exponential backoff for 429 responsesin 12 of 489, across 3 files
  • include a single clear call to actionin 12 of 489, across 9 files

Said here and by no other author read

  • filter posting targets to connected platforms
  • add at least one image for instagram posts
  • use python to execute social posts
  • use postforme as the primary provider

Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.