Autopilot is a series that makes and posts videos on its cadence with nobody at the keyboard. It is free. You bring the topics (a list, or your own RSS, subreddit, and YouTube channel sources) and your own platform keys. It needs no account. See Account. A series is safe by default. A new series starts in dry-run: it runs the whole pipeline and records a dry-run publication, but it uploads nothing and sends no reply. You go live on purpose, once.
1

Add your keys

Open the Connections page (npx vfrey open, then Connections under Setup). See The Connections page.
2

Let it dry-run

Run a few ticks. Look at the videos and at the Publications page, where each dry run has a dry-run badge.
3

Go live

Type the channel id once. See Go live.
4

Keep it running

npx vfrey service install runs the worker in the background. See Background worker.

The Connections page

The Connections page (/keys on the dashboard, called Keys in older versions) holds one form per platform: YouTube, TikTok, Instagram, Facebook, and Reddit sources. It is write-only.
  • A saved value is never shown again. The page shows present or missing, and when each value was set. Older values show “Set earlier”.
  • A blank field keeps the stored value. Only a field you fill in changes.
  • Clear is its own button, with an inline confirm.
  • The values go to the same secret store the desk secret verbs use. They are never echoed and never logged.
The Meta app id and secret you save under Instagram also serve Facebook. An agent can set a key from the terminal with npx vfrey desk secret set, through stdin. See Local desk.

Go live

A new series has live = false. In that state a tick runs the whole pipeline and records a dry-run publication with no upload, and a reply to a comment is drafted but not sent. To go live, type the channel id of the account the series posts to. This is so a series never posts to the wrong channel.
Open the series page and press Go live. The page lists the channel ids on file (the TikTok open id, the Instagram user id, the Facebook page id). Type one of them exactly.
A typed id that does not match refuses, with a Fix: line. YouTube has no id in your keys, so for a YouTube series with no id on file, the id you type is saved as the channel id, and the series goes live with it. Each change is recorded as an event on the series page (went_live, went_dry_run, and the switches).
A series you already had before this feature stays live only if it already has a real publication. Every other series became dry-run. Series imported from an accounts.json start in dry-run.

The switches

Each series has three switches, on the series page or with desk series update.
--publish, --engage, and --review each take true or false.

Never uploads twice

A video is never uploaded twice to the same platform. Once a job has a publish session or an external id for a platform, no retry, resume, cancel-and-retry, or second worker starts a new upload for it.
  • A job claim carries a token. If you cancel or retry a job, or another worker takes it over, the first worker loses its claim and stops without writing.
  • npx vfrey desk job retry refuses while the worker that held a cancelled job is still running, because it may be in the middle of an upload. It works once that worker has stopped.
  • A series that is not live, or has publish off, never overwrites an unfinished upload with a dry run. It marks the platform skipped and keeps the ids.
  • A TikTok publish that TikTok reports as failed with internal is not restarted with a fresh session. It counts as a failed job.

Review before render

With review on, a job runs its script, scene, and before-render quality checks, then stops in the awaiting_review state. A compliance failure blocks the job before that, so it never reaches review. The Review screen (/review) shows each waiting job with its script, a preview of the scene, and the check results.
  • Approve puts the job back to pending. The next tick renders it, runs the after-render checks, and then the normal publish rules.
  • Reject ends the job as rejected with the code review_rejected and your reason. desk job retry still works on it.
The tick summary prints both commands for a waiting job, and tick --json has review: { approve, reject } on it. A waiting job does not claim a worker, and it counts as a video made, so the series keeps its normal cadence and does not pile up waiting jobs. The worker’s service status shows how many are waiting.

Live scene preview

The run page and the Review screen play an HTML scene in the browser, in sync with the voice, so you can scrub through it before a render. The preview is served from your project’s dashboard on your own machine, with the same files vfrey supplies at render time. It cannot reach the network. Only HTML scenes (vfrey-framey or hyperframes) have the live preview. A Remotion scene shows a still frame instead. See Scenes.

The screens

The dashboard has four read-only screens for a series on autopilot. Run npx vfrey open to see them. Also on the dashboard: Topics, Creators, and Mail, which are paid features, and Review.