Intermediate

Paste this guide into Claude Code and it will walk you through every step interactively.

Auto-Post to 4 Platforms at Once

What this gives you: One command takes your finished video from Trello and publishes it to TikTok, Instagram Reels, YouTube Shorts, and LinkedIn simultaneously. Captions, hashtags, and cover image all handled automatically.

The Distribution Problem

You film one video but need to post it on 4 different platforms. Each has its own app, its own upload flow, its own caption format. That is 20+ minutes of manual work per video - per post, every time.

Multiply that by 5 videos a week and you are spending two hours on distribution alone. The /post-content skill eliminates that. One command reads your Trello card, downloads the video, writes platform-optimised captions, and publishes everywhere simultaneously.

What Is Zernio

Zernio is a social media scheduling API that handles multi-platform publishing. You send it a video URL, a caption, and your connected platform accounts - it takes care of the rest. No browser automation, no Selenium, no unofficial hacks. It uses the official platform APIs under the hood.

DetailValue
Base URLhttps://zernio.com/api/v1
AuthenticationBearer token in the Authorization header
Supported platformsTikTok, Instagram, YouTube, LinkedIn, Twitter/X
Video inputHTTPS URL to the video file
Key env varZERNIO_API_KEY

Step 1: Set Up Zernio

Before writing a line of skill code, get your Zernio account fully configured.

  1. Create an account at zernio.com
  2. Connect each platform: TikTok, Instagram, YouTube, LinkedIn
  3. Go to API settings and generate an API key
  4. On each connected platform page, copy the Account ID - you will need this per-platform when calling the API
  5. Add your key to your environment file:
# ~/.env ZERNIO_API_KEY=zernio_live_xxxxxxxxxxxxxxxxxxxx ZERNIO_TIKTOK_ID=your_tiktok_account_id ZERNIO_INSTAGRAM_ID=your_instagram_account_id ZERNIO_YOUTUBE_ID=your_youtube_account_id ZERNIO_LINKEDIN_ID=your_linkedin_account_id

Load your env file in every shell session by sourcing it in ~/.zshrc or ~/.bashrc: source ~/.env. Never hardcode these values anywhere else.

Step 2: The Skill Structure

Create the skill directory and file:

mkdir -p ~/.claude/skills/post-content

The skill lives at ~/.claude/skills/post-content/SKILL.md. It takes a Trello card URL or ID as its only input and handles everything from there.

--- name: post-content description: > Publish a finished short-form video to TikTok, Instagram Reels, YouTube Shorts, and LinkedIn. Reads the Trello card for video URL and metadata. Use when the user says "post", "publish", or references a card that is ready to go live. triggers: - "post content" - "publish video" - "post this" - "go live" --- # /post-content Skill Input: Trello card URL or card ID. Steps: 1. Read the Trello card (title, description, attachments) 2. Download or identify the video URL from the attachments 3. Host the video at a unique HTTPS URL if not already hosted 4. Generate caption and hashtags from the card title + description 5. Post to each platform via separate Zernio API calls 6. Update the Trello card with publish status and results

Step 3: Video Preparation

Zernio needs a publicly accessible HTTPS URL to your video. It does not accept local file uploads. Three options:

Option A: Host on your VPS via nginx

# Upload to VPS with a unique timestamped filename FILENAME="video-$(date +%Y%m%d-%H%M%S).mp4" scp video.mp4 vps:/var/www/html/tmp-media/${FILENAME} # URL becomes: https://yourdomain.com/tmp-media/${FILENAME}

Option B: S3 or Google Drive

# S3 presigned URL (valid for 1 hour by default - set longer) aws s3 cp video.mp4 s3://your-bucket/tmp-media/${FILENAME} aws s3 presign s3://your-bucket/tmp-media/${FILENAME} --expires-in 86400
Warning: Always use unique filenames when hosting videos for Zernio. The API caches URLs aggressively. If you upload a new video to the same URL, Zernio will post the old cached version.

Step 4: Caption Generation

Claude Code reads the Trello card title and description to generate captions. The logic is deterministic, not creative guessing - you give it a pool to draw from.

## Caption Generation Rules Base caption: - 1-10 words maximum - Punchy, direct, no filler - Derived from the card title - No em dashes, no rhetorical questions Hashtag pool (select 5 relevant): #AIAutomation #ClaudeCode #ContentCreator #BuildInPublic #AITools #SoloPreneur #AgencyLife #ContentStrategy #Automation #AIAgency #DigitalNomad #WorkSmarter #ShortFormContent #CreatorEconomy #ProductivityHacks Platform-specific adjustments: - YouTube Shorts: append #Shorts as the first hashtag - LinkedIn: remove casual hashtags, keep professional ones only - TikTok/Instagram: use all 5 hashtags from the pool selection
Tip: Post to each platform separately rather than all at once. If Instagram rejects the video (too large, wrong format), TikTok and YouTube still go through. Separate calls mean partial success is possible.

Step 5: Publishing via the Zernio API

Each platform gets its own API call. If one fails, the others are unaffected. Run these sequentially - not in parallel - so you can log each result before moving to the next.

TikTok

curl -s -X POST "https://zernio.com/api/v1/posts" \ -H "Authorization: Bearer $ZERNIO_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "content": "CAPTION #AIAutomation #ClaudeCode #ContentCreator #BuildInPublic #AITools", "publishNow": true, "platforms": [{"platform": "tiktok", "accountId": "YOUR_TIKTOK_ID"}], "mediaItems": [{"url": "VIDEO_URL", "type": "video"}] }'

Instagram Reels

curl -s -X POST "https://zernio.com/api/v1/posts" \ -H "Authorization: Bearer $ZERNIO_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "content": "CAPTION #AIAutomation #ClaudeCode #ContentCreator #BuildInPublic #AITools", "publishNow": true, "platforms": [{"platform": "instagram", "accountId": "YOUR_INSTAGRAM_ID"}], "mediaItems": [{"url": "VIDEO_URL", "type": "video"}] }'

YouTube Shorts

curl -s -X POST "https://zernio.com/api/v1/posts" \ -H "Authorization: Bearer $ZERNIO_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "content": "CAPTION #Shorts #AIAutomation #ClaudeCode #ContentCreator #BuildInPublic", "publishNow": true, "platforms": [{"platform": "youtube", "accountId": "YOUR_YOUTUBE_ID"}], "mediaItems": [{"url": "VIDEO_URL", "type": "video"}] }'

LinkedIn

curl -s -X POST "https://zernio.com/api/v1/posts" \ -H "Authorization: Bearer $ZERNIO_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "content": "CAPTION #AIAutomation #ClaudeCode #AgencyLife #BuildInPublic #AITools", "publishNow": true, "platforms": [{"platform": "linkedin", "accountId": "YOUR_LINKEDIN_ID"}], "mediaItems": [{"url": "VIDEO_URL", "type": "video"}] }'

Critical API Notes

Common gotchas that will silently fail or produce wrong results:

IssueWhat to do
Wrong media field nameField is mediaItems, not media. Using media will return no error but post nothing.
Newlines in content fieldNo \n characters in the JSON content field. Flatten captions to a single line before posting.
Video too large for InstagramInstagram rejects files over 50MB. Compress first: ffmpeg -i input.mp4 -vcodec libx264 -crf 28 output.mp4
Duplicate content rejectionPosting identical content within 24 hours gets rejected. Vary captions slightly per platform if reposting.
TikTok rate limitsIf you get a rate limit error, wait 5 minutes before retrying. Do not loop immediately.
Cached video URLAlways verify your video URL returns HTTP 200 before posting: curl -I VIDEO_URL | grep HTTP

Step 6: Update Trello After Publishing

After all four API calls complete, the skill updates the Trello card automatically. This creates a clean audit trail - you always know which cards have been published and where.

## Post-Publish Trello Updates 1. Mark the card's due date as complete (signals "published") 2. Add a comment with the publish results: Published [DATE] [TIME]: - TikTok: SUCCESS (post ID: xxx) - Instagram: SUCCESS (post ID: xxx) - YouTube Shorts: SUCCESS (post ID: xxx) - LinkedIn: FAILED - video over 50MB, compress and retry 3. Move the card to "Published" list if one exists on the board

Want your content distribution fully automated?

I can build the complete pipeline from raw video to published on all platforms.

Book a Call

The Full Content Pipeline

This skill is step 4 in a four-step pipeline. Here is how all the skills chain together for a full week of content:

# Step 1: Generate 30 script ideas and save to Trello /write-shorts -> 30 short-form video scripts added as Trello cards # Step 2: Film the best 5-7 as raw video files ~ 30 minutes of filming ~ # Step 3: Add captions and update the Trello card /short-form-content [video.mp4] [trello-card-url] -> Captioned video ready, card updated with video attachment # Step 4: Publish everywhere /post-content [trello-card-url] -> Live on TikTok, Instagram, YouTube Shorts, LinkedIn

Total hands-on time: roughly 45 minutes for a full week of content across 4 platforms. The rest is the pipeline running.

Automating with Cron

Once the skill works reliably manually, move scheduling to your VPS. A cron job checks Trello every hour for cards in the "Ready to Post" list and publishes them automatically - no human needed.

# On your VPS - check every hour between 8am and 8pm 0 8-20 * * * /home/jarvis/scripts/auto-post.sh >> /var/log/auto-post.log 2>&1
#!/bin/bash # /home/jarvis/scripts/auto-post.sh source /home/jarvis/.env # Get all cards in the "Ready to Post" Trello list CARDS=$(curl -s "https://api.trello.com/1/lists/${TRELLO_READY_LIST_ID}/cards?key=${TRELLO_KEY}&token=${TRELLO_TOKEN}" \ | jq -r '.[].id') # Publish each card and move it to "Published" for CARD_ID in $CARDS; do echo "Publishing card: $CARD_ID" # Call your post-content logic here (or invoke via Claude Code API) bash /home/jarvis/scripts/publish-card.sh "$CARD_ID" sleep 120 # 2-minute gap between posts to avoid rate limits done
Tip: Add a "Publish After" custom field to your Trello cards. The cron script checks this field and skips cards where the publish time has not arrived yet. That gives you scheduled posting without a paid scheduling tool.
Back to
All Guides