How the Scheduler Works
Architecture
Worker Responsibilities
- Polling: Checks
scheduled_postscollection every 60 seconds - Due Detection: Finds posts where
scheduled_time <= NOW()andstatus = 'queued' - Job Creation: Creates
media_jobswithoperation: 'publish_post' - Platform Dispatch: Uses Stagehand to automate platform-specific posting workflows
- Status Updates: Marks posts as
publishedorfailedafter completion
Scheduling Your First Post
Prepare Your Content
Before scheduling, make sure you have:
- Media file: Image, video, or audio uploaded to
/app/media - Caption: Written text (or generate with AI — see AI Captions guide)
- Platform connection: At least one platform connected in
/app/platforms
Open the Scheduling Interface
Option 1: Via Media Library
- Go to
/app/media - Click on a media item to open the detail view
- Click Schedule Post button
- Click the chat icon (bottom-right)
- Type:
- Genie will create the scheduled post for you
Fill Out Post Details
In the scheduling modal, enter:Platform: Select target platform (OnlyFans, Fansly, Instagram, etc.)Media: Select one or more files from your libraryCaption: Enter your post text (max 5000 characters)Scheduled Time: Pick date and time (uses your browser’s timezone, converted to UTC on save)Tags (optional): Add platform-specific hashtags or tagsPrice (optional): For paid content platforms (OnlyFans PPV, Fansly tiers, etc.)
Click 'Schedule Post'
The system:
- Creates a
scheduled_postsrecord: - Redirects you to
/app/calendar(or shows success toast)
Queue Management
Viewing Your Queue
All scheduled posts are visible in:- Calendar View (
/app/calendar) — visual timeline - Dashboard Stats — “Scheduled” count in the stat card
- Directus Admin (
/admin→scheduled_postscollection)
Editing a Scheduled Post
Update Fields
Modify:
- Caption
- Scheduled time
- Media attachments
- Tags/hashtags
Canceling a Scheduled Post
Confirm Deletion
A confirmation modal appears: “Cancel this scheduled post? This cannot be undone.”Click Confirm.
Platform-Specific Publishing
Each platform has unique posting requirements. Genie uses Stagehand browser automation to handle them.OnlyFans
Supported:- Image posts (single or gallery)
- Video posts (up to 5GB)
- Caption text (max 5000 chars)
- Price (free or PPV)
- Post visibility (all subscribers / VIP only)
- Stagehand logs in (using cookies or credentials)
- Navigates to Post page
- Uploads media via file input
- Fills caption textarea
- Sets price dropdown (if PPV)
- Clicks Publish
- Waits for success confirmation
Fansly
Supported:- Image/video posts
- Captions (max 3000 chars)
- Tier restrictions (All / Tier 1 / Tier 2 / Tier 3)
- Scheduled posts (via Fansly’s native scheduler)
- Feed posts (1:1 or 4:5 aspect ratio)
- Reels (9:16 vertical video)
- Captions (max 2200 chars)
- Hashtags (up to 30)
- No direct API — uses Stagehand to automate the web uploader
- May trigger bot detection — use sparingly
- Alt text not supported (yet)
- Navigate to instagram.com
- Click + Create
- Upload media
- Add caption and hashtags
- Click Share
TikTok
Supported:- Video posts (9:16, 15s–10min)
- Captions (max 150 chars)
- Hashtags
- No automation support yet — requires manual upload
- Stagehand integration planned for Phase 10
X (Twitter)
Supported:- Text posts (max 280 chars, or 25,000 for X Premium)
- Image posts (up to 4 images)
- Video posts (max 2:20 for free, 60 min for Premium)
- Navigate to x.com
- Click Post button
- Fill text box
- Upload media
- Click Post
Queue Size Limits
The number of posts you can have queued at once depends on your plan:| Plan | Max Queued Posts |
|---|---|
| Starter | 3 |
| Creator | Unlimited |
| Pro | Unlimited |
| Studio | Unlimited |
Monitoring Published Posts
Real-Time Status Updates
When the scheduler picks up a post:- Status changes to
publishing(blue “Processing” badge) - Job created in
media_jobswithoperation: 'publish_post' - Stagehand browser session starts
- Platform login + upload + submit
- Status updates to
published(green “Published” badge) orfailed(red “Failed” badge)
Success Confirmation
On success, thescheduled_posts record stores:
Failure Handling
If publishing fails:- Status changes to
failed - Error message stored in
error_messagefield - Post card shows Retry button
- Click Retry to re-queue the post
- “Login failed: Invalid cookies” → Recapture cookies via HITL guide
- “Media upload failed: File too large” → Compress the file first
- “Platform error: Duplicate content detected” → Platform rejected the post (edit and retry)
Advanced: Bulk Scheduling
Schedule multiple posts at once using the AI chat widget.Example: Schedule a Week of Content
- Parse the list
- Create 7
scheduled_postsrecords - Calculate UTC timestamps for each “6 PM” in your timezone
- Return a summary with post IDs
Troubleshooting
Post stuck in 'publishing' for 10+ minutes
Post stuck in 'publishing' for 10+ minutes
Cause: Stagehand browser session hung or worker crashed.Fix:
- SSH to server:
pm2 logs media-worker - Look for errors mentioning the job ID
- Restart worker:
pm2 restart media-worker - Go to
/app/calendarand click Retry on the post
Post published but status still shows 'queued'
Post published but status still shows 'queued'
Cause: Worker failed to update Directus after publishing.Fix:
- Check
media_jobsin/adminfor the job’s actual status - Manually update
scheduled_postsrecord: setstatus: 'published' - Report the bug to support
Post failed: 'Platform login required'
Post failed: 'Platform login required'
Cause: Cookies expired or credentials invalid.Fix:
- Go to
/app/platforms - Check platform connection status
- If red “Error” badge, recapture cookies via the browser extension (HITL guide)
- Retry the post
Can't schedule more posts (queue full)
Can't schedule more posts (queue full)
Cause: You’ve hit your plan’s queue limit (3 for Starter, unlimited for paid plans).Fix:
- Wait for existing posts to publish (they auto-remove from queue)
- Or cancel some queued posts to free up slots
- Or upgrade to Creator tier for unlimited queue
Next Steps
AI Captions
Generate engaging captions for scheduled posts
Media Workflows
Watermark and compress before scheduling
HITL Sessions
Keep platform cookies fresh for reliable publishing
