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:
- The pipeline generates posts and video variants for each platform
- Posts are queued locally for review (nothing is published automatically)
- You review, edit, approve, or reject posts via
vidpipe review - 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
Quick Setup (Recommended)
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.jsonwith optimal posting times
Manual Setup
- Sign up at getlate.dev — Choose the Build plan
- Connect your social accounts in the Late dashboard
- Add your API key to
.env:LATE_API_KEY=sk_your_key_here - Create
schedule.json(or runvidpipe initto 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": [] } } } - 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) = RejectE= EditSpace= 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
| Field | Description |
|---|---|
timezone | Your local timezone (IANA format) |
slots[].days | Days of the week to post (mon-sun) |
slots[].time | Time in HH:MM format |
slots[].label | Human-readable description of the time slot |
avoidDays | Days to never post |
Default Times (Research-Backed)
| Platform | Best Times | Best Days |
|---|---|---|
| 8 AM, 12 PM | Tue–Wed | |
| TikTok | 7 PM | Tue–Thu |
| 10 AM, 7:30 PM | Tue–Thu | |
| YouTube | 3 PM, 8 PM | Thu–Fri |
| X/Twitter | 8:30 AM, 12 PM, 5 PM | Mon–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-queuescreates/updates Late queues fromschedule.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
scheduledForcalculation 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
| Command | Description |
|---|---|
vidpipe init | Interactive setup wizard |
vidpipe review | Open post review web app |
vidpipe review --port 3847 | Custom port |
vidpipe schedule | View posting schedule |
vidpipe schedule --platform X | Filter by platform |
vidpipe doctor | Verify setup |
vidpipe sync-queues | Sync schedule.json queue definitions to Late API |
vidpipe reschedule | Reschedule idea-linked posts for optimal placement |
vidpipe realign --queue | Queue-based realignment (reshuffleExisting) |
--no-social-publish | Skip queue-build stage |