How it all fits together

Two minutes of reading now saves you an hour of confusion later. Here's the whole system.

1

Connect your social accounts

One click each. You approve on Facebook's / Google's own screen — we never see your password.

2

Point us at your storage (optional)

Your videos stay in your account — your free tier, your files. We just need to read them at posting time. Or skip this and paste public links.

3

Fill your content library

Add each video once, with a sentence describing it. That description is what the AI writes captions from — the better it is, the better the captions.

4

Run Autopilot

Pick 7, 30, 180 days. We take unposted videos, write a different caption for every platform, and fill your calendar.

Your computer can be off. Everything runs on our servers. Once posts are scheduled, they go out on time whether your laptop is open, closed, or in another country.

Connect your accounts

Dashboard → Connected accounts → pick a platform → approve. That's the whole thing.

You never need an API key. People expect to go hunting in a developer console — you don't. We run one app per platform; you just approve access to your account on the platform's own screen.

What each platform needs from you

PlatformRequirement
FacebookYou must be an admin of a Page. Personal profiles can't be posted to via any official API — that's Meta's rule, not ours.
InstagramMust be a Business or Creator account, and linked to a Facebook Page. Convert in the Instagram app: Settings → Account type.
YouTubeJust your channel. Nothing to set up.
TikTokAny account. Until TikTok approves our app, videos land in your Drafts — you tap Post once on your phone.
If a platform button says "Not set up yet", that's on us, not you — it means we haven't finished that platform's app review. Everything else keeps working.

Paste your own token

For when one-click isn't on yet — or when you'd rather use your own developer app.

Why this exists. One-click connect only switches on after our app clears each platform's App Review, and Meta's can take weeks. We're not going to make you wait: if you already have a token from your own app, paste it and post today.
1

Dashboard → Connected accounts → the platform card → Paste token.

2

Fill in the fields and hit Check & connect.

We call the platform right then to make sure the token works and can actually post — not just read. A bad token is rejected on the spot, with the platform's own error message. You'll never find out at 8pm because a post silently failed.

Where each value comes from

PlatformWhat you needWhere
Facebook Page ID, Page Access Token Graph API Explorer → pick your app → pick your Page → tick pages_manage_posts → Generate Token
Instagram IG Business Account ID, Page Access Token Same token as Facebook. Get the ID from /me/accounts?fields=instagram_business_account
YouTube Client ID, Client Secret, Refresh Token Google Cloud Console → Credentials. Refresh token from OAuth Playground, scope youtube.upload
TikTok Access Token, Refresh Token TikTok for Developers → your app → scope video.publish
Your token is encrypted the moment it's saved — same Fernet encryption as one-click, same storage. It never comes back out through the API, and it's never written to a log.
Facebook tokens expire in about 60 days. The dashboard shows a countdown on the account card. When one-click connect turns on, reconnect once and you'll never think about it again.

Storage: which one to pick

Your videos live in your storage account, not ours. You keep your free tier and your files; we never charge you for space.

OptionFreeBandwidth costVerdict
Cloudflare R210 GBFreeBest for video — start here
Amazon S35 GBBilled per GBOnly if you're already on AWS
Google Drive15 GBFreeWon't work for Facebook/Instagram — see below
Paste linksSimplest; no space tracking
Why R2 wins for video. Every provider gives you some free storage, but video burns bandwidth, not storage — a 50 MB clip fetched 500 times is 25 GB of transfer. S3 bills you for that. R2 charges zero. Same 10 GB of files, wildly different bill.

Cloudflare R2 — step by step

About 3 minutes. Free, no credit card for the free tier. You collect three values; we do everything else automatically.

1

Create a free account at dash.cloudflare.com/sign-up.

2

Copy your Account ID — it's the long string in your dashboard URL: dash.cloudflare.com/<account-id>.

3

Go to R2 → Manage API Tokens → Create Account API token. Permission: Admin Read & Write.

It has to be Admin, not "Object" — we create the bucket for you, and only Admin can do that. Pick Object-level and the save will fail.

Copy the Access Key ID and Secret Access Key — the secret is shown once. Close the page without copying and you'll have to make a new token.

4

Paste the three values in Storage → Cloudflare R2 and hit save.

Just switched R2 on? Give it a couple of minutes. Cloudflare needs a moment to bring your account's storage endpoint online, and until it does the save fails with a connection error even though every value is correct.

On save we verify the key against Cloudflare (a bad key is rejected on the spot), create the bucket for you, and measure space already used so the full-storage warnings are accurate from day one. You never touch bucket settings.

That's the whole thing. No bucket creation, no public-URL setup — the old manual steps are gone. If you see an "Account ID" error on save, re-copy the ID from your dashboard URL; that's the value people most often get wrong.

Amazon S3 — step by step

Works fine. Just know what you're signing up for on the bill.

Read this first. AWS bills for every GB leaving S3. One video that takes off can turn a $0 month into a real invoice. R2 does the same job with no bandwidth charge. Only pick S3 if you're already on AWS.
1

In the AWS console, open S3Create bucket. Note the region (e.g. us-east-1).

2

Allow public reads on the bucket so Facebook/Instagram can fetch the files.

3

Open IAMUsers → create a user → attach a policy limited to this bucket only.

Don't use your root key. If it ever leaks, you want the damage limited to one bucket.

4

Create an access key for that user, then paste the key, secret, bucket, and region into Storage → Amazon S3.

Google Drive

15 GB free and you probably already have it — but there's a catch worth knowing before you invest time.

Drive can't post to Facebook or Instagram. Meta's API downloads your video from a direct file URL. Drive share links return a viewer page, not the file — so Meta rejects them. This is a Drive limitation we can't code around. Drive is fine for YouTube and TikTok, where we upload the bytes ourselves.
Our honest advice: if you post to Facebook or Instagram at all, use R2. It's free, takes 5 minutes, and works everywhere.

Content library

Your pool of videos. Add each one once; Autopilot pulls from here.

1

Storage → Content library → Add video.

2

Fill in the title, the video URL, and — the important one — what's in it.

That description is the only thing the AI sees when writing your captions.

Descriptions are where the quality comes from.
Weak: "my video" → you'll get generic captions.
Strong: "Cinematic AI flythrough of a neon Tokyo street at night, rain, slow synth, 12s, made with Kling" → captions that sound like you meant them.

How we avoid reposting the same thing

Every video is tagged Never posted or Posted N×. Autopilot always drains the never-posted pile first. Only when it's empty do we recycle — and then we take whatever has gone unposted the longest. You'll never get the same clip twice in one run.

Autopilot

Pick a duration, read what we suggest, approve. Nothing posts until you say so.

1

Pick how long you want covered: 1, 3, 7, 15, 30, 60, 90, or 180 days.

2

Set posts per day (1–5), tone, and which accounts.

The summary does the math for you: posts per day × days = videos needed. 3 a day for 30 days needs 90 videos. It compares that to your library and warns you before you run, so there are no surprises after the fact.

3

Hit Suggest my calendar.

We pick videos that have never been posted (oldest first), and the AI writes a caption for each one on each platform. Still nothing scheduled at this point.

4

Read the list. Untick anything you don't like, then Approve & schedule.

Only the ticked posts get scheduled — and they go out with the exact caption you just read. We don't re-write it behind your back.

Your suggestion is held for 60 minutes. Take your time reading it. If you leave it longer than that, just hit Suggest again — we'd rather make you redo it than schedule something stale.
Short on videos? If you ask for 90 videos and your library only has 20, we tell you plainly and recycle your oldest posted ones for the gap — never the same video twice while a fresh one exists.
Posting times aren't random. Each platform gets its own slot — TikTok at 8pm, YouTube at 5pm, X at 9am — based on when people are actually on them.
One AI call per video, not per post. A video going to 5 platforms still costs one call — you get 5 different captions for the price of one.

Magic Post

For a single video, right now, without touching the library.

1

Describe the video in one sentence.

2

Pick accounts, tone, language.

3

Write & schedule everything. Every platform gets its own caption, at its own best time.

Each caption comes with a line explaining why it's written that way for that platform. Read a few and you'll start writing better ones yourself.

AI Studio — generate videos with Kling

Type an idea, get a finished video in your library a few minutes later — generated on your own Kling API package (klingai.com → Developer → API Keys; trial pack ≈ $9.80, then pay-as-you-go per second of video).

  1. In the dashboard open AI Studio and paste your Kling Access Key + Secret Key (we verify them live with Kling before saving; stored encrypted).
  2. Describe the video, pick 5s or 10s, pick the shape (9:16 for Shorts/Reels/TikTok), choose your R2/S3 storage as destination.
  3. Hit Generate and close the page if you like — when Kling finishes, we pull the file into your storage and add it to Content library automatically. Autopilot can post it on the next run.

Affiliate / product links

Add one link to a post (or to a whole Autopilot plan) and we place it the way each platform actually allows: X and YouTube get it inside the post/description, Facebook feed gets it in the caption, TikTok/Instagram get a "Link in bio" call-to-action. #ad is added automatically to keep you FTC-compliant. Remember to put your link in your TikTok/Instagram bio once.

Audience timezone

In Autopilot, set Audience location to where your viewers are. Posting from Vietnam to US customers? Pick "US East" and 8pm TikTok means 8pm New York time — conversion is automatic.

AI assistant access (MCP)

In Settings → AI assistant access, generate your private MCP connection URL and add it to Claude (Settings → Connectors → Add custom connector) or any MCP-capable AI. Then just say things like "add these three videos and schedule 30 days of posts" — the assistant previews the plan and only schedules after you approve. Treat the URL like a password; generating it again gives you a fresh one.

When things break

What you seeWhat's actually going on
"Token expired — reconnect" Facebook tokens die after ~60 days; it's Meta's rule. Click Connect again — 5 seconds, nothing is lost.
Post failed on Instagram Almost always the video URL. It must be public and a direct file link. Paste it into a private window — if you don't get the raw video, Instagram won't either.
TikTok video sits in Drafts Working as intended. Until TikTok approves our app, that's the only thing their API allows. Tap Post once on your phone.
"AI captions are switched off" The AI key isn't configured on the server. Everything else works — schedule manually from Schedule post.
Autopilot: "Library is empty" Add videos to your Content library first — Autopilot only posts what you've given it.
Storage says "Full" Over 95% used. Run Check now under Clean-up suggestions — we'll show posted videos safe to delete (never ones still queued).
A post failed once, then worked That's the retry doing its job. Network blips get retried 3 times (5, 15, 45 min apart). Only real errors — like a dead token — stop immediately.
Still stuck? Send us the post ID from Post history and we'll tell you exactly what happened.