Social Media Publishing

April 3, 2026 · View on GitHub

Overview

vidpipe can automatically generate and schedule social media posts for your videos across 5 platforms: TikTok, YouTube, Instagram, LinkedIn, and X/Twitter.

How it works:

  1. The pipeline generates posts and video variants for each platform
  2. Posts are queued locally for review (nothing is published automatically)
  3. You review, edit, approve, or reject posts via vidpipe review
  4. Approved posts are scheduled at optimal times via Late

Prerequisites

  • A Late account (Build plan: $19/mo, 120 posts/mo)
  • Social media accounts connected in the Late dashboard

Setup

Run the interactive setup wizard:

vidpipe init

This walks you through:

  • Verifying FFmpeg installation
  • Setting up API keys (OpenAI, Late)
  • Connecting social accounts
  • Creating schedule.json with optimal posting times

Manual Setup

  1. Sign up at getlate.dev — Choose the Build plan
  2. Connect your social accounts in the Late dashboard
  3. Add your API key to .env:
    LATE_API_KEY=sk_your_key_here
    
  4. Create schedule.json (or run vidpipe init to auto-generate):
    {
      "timezone": "America/Chicago",
      "platforms": {
        "linkedin": {
          "slots": [
            { "days": ["tue", "wed"], "time": "08:00", "label": "Morning thought leadership" },
            { "days": ["tue", "wed", "thu"], "time": "12:00", "label": "Lunch break engagement" }
          ],
          "avoidDays": ["sat", "sun"]
        },
        "tiktok": {
          "slots": [
            { "days": ["tue", "wed", "thu"], "time": "19:00", "label": "Prime entertainment hours" },
            { "days": ["fri", "sat"], "time": "21:00", "label": "Weekend evening" }
          ],
          "avoidDays": []
        },
        "instagram": {
          "slots": [
            { "days": ["tue", "wed", "thu"], "time": "10:00", "label": "Morning scroll" },
            { "days": ["wed", "thu", "fri"], "time": "19:30", "label": "Evening couch time" }
          ],
          "avoidDays": []
        },
        "youtube": {
          "slots": [
            { "days": ["fri"], "time": "15:00", "label": "Afternoon pre-weekend" },
            { "days": ["thu", "fri"], "time": "20:00", "label": "Prime evening viewing" }
          ],
          "avoidDays": ["mon"]
        },
        "twitter": {
          "slots": [
            { "days": ["mon", "tue", "wed", "thu", "fri"], "time": "08:30", "label": "Morning news check" },
            { "days": ["tue", "wed", "thu"], "time": "12:00", "label": "Lunch scroll" },
            { "days": ["mon", "tue", "wed", "thu", "fri"], "time": "17:00", "label": "Commute home" }
          ],
          "avoidDays": []
        }
      }
    }
    
  5. Verify setup:
    vidpipe doctor
    

Reviewing Posts

vidpipe review

This opens a web app at http://localhost:3847 with a card-based review interface:

  • ✅ Approve — Schedules the post at the next optimal time
  • ❌ Reject — Removes the post from the queue
  • ✏️ Edit — Inline text editing with character count
  • ⏭️ Skip — Leave for later review

Keyboard shortcuts:

  • (Right Arrow) = Approve
  • (Left Arrow) = Reject
  • E = Edit
  • Space = Skip

Schedule Configuration

schedule.json controls when posts are scheduled per platform:

{
  "timezone": "America/Chicago",
  "platforms": {
    "linkedin": {
      "slots": [
        { "days": ["tue", "wed"], "time": "08:00", "label": "Morning thought leadership" },
        { "days": ["tue", "wed", "thu"], "time": "12:00", "label": "Lunch break engagement" }
      ],
      "avoidDays": ["sat", "sun"]
    }
  }
}

Configuration Options

FieldDescription
timezoneYour local timezone (IANA format)
slots[].daysDays of the week to post (mon-sun)
slots[].timeTime in HH:MM format
slots[].labelHuman-readable description of the time slot
avoidDaysDays to never post

Default Times (Research-Backed)

PlatformBest TimesBest Days
LinkedIn8 AM, 12 PMTue–Wed
TikTok7 PMTue–Thu
Instagram10 AM, 7:30 PMTue–Thu
YouTube3 PM, 8 PMThu–Fri
X/Twitter8:30 AM, 12 PM, 5 PMMon–Fri

Viewing the Schedule

vidpipe schedule
vidpipe schedule --platform linkedin

Queue Structure

Posts are stored in {OUTPUT_DIR}/publish-queue/:

publish-queue/
├── my-tip-tiktok/
│   ├── media.mp4        # Platform-optimized video
│   ├── metadata.json    # Scheduling and platform data
│   └── post.md          # Post text content

Approved posts move to published/. Rejected posts are deleted.

Queue-First Scheduling

VidPipe uses Late's built-in queue system as the primary scheduling mechanism:

  • vidpipe sync-queues creates/updates Late queues from schedule.json
  • Queue names follow {platform}-{clipType} (e.g. youtube-short, linkedin-medium-clip)
  • Approvals use queuedFromProfile + queueId — Late assigns slots server-side
  • Falls back to local scheduledFor calculation only when no queue exists

Troubleshooting

"No Late API key configured"

Run vidpipe init or add LATE_API_KEY=... to .env

"No social accounts connected"

Log into getlate.dev and connect your social accounts

"No available schedule slots"

Your schedule.json may be too restrictive. Add more time slots.

"Upload failed"

Check your internet connection. Late API requires network access to upload media.

Token expiry

Some platforms (e.g., TikTok) have short-lived tokens. Late handles refresh automatically, but you may need to reconnect in the Late dashboard if you see auth errors.

CLI Reference

CommandDescription
vidpipe initInteractive setup wizard
vidpipe reviewOpen post review web app
vidpipe review --port 3847Custom port
vidpipe scheduleView posting schedule
vidpipe schedule --platform XFilter by platform
vidpipe doctorVerify setup
vidpipe sync-queuesSync schedule.json queue definitions to Late API
vidpipe rescheduleReschedule idea-linked posts for optimal placement
vidpipe realign --queueQueue-based realignment (reshuffleExisting)
--no-social-publishSkip queue-build stage