Skip to content

Autopilot

Autopilot is Whisper's local-first daemon that watches your inbox for unread messages, drafts replies, and lets you approve them in a live cockpit. It's the difference between sitting at the keyboard typing every reply yourself and sitting back while Whisper hands you finished drafts to approve, edit, or reject.

Autopilot is designed to be safe to leave running. It claims its own conversations, coordinates with other operators on your team, and refuses to send anything sensitive (PPVs, custom requests, priced offers, explicit content) without your explicit approval.

What Autopilot is

Autopilot is a long-running process that lives on your local machine. It:

  1. Polls your account for unread messages every few seconds.
  2. Drafts a reply for each one in an isolated environment that has no access to your other chats, your earnings, or anything outside that one conversation.
  3. Runs every draft through a deterministic safety policy.
  4. Either queues the draft for your approval, or (for routine, non-explicit replies, and only if you turned it on) sends it automatically.
  5. Shows everything inline in your Terminal so you can approve, edit, reject, or skip with a single keypress.

Everything Autopilot does is logged. You can replay any run, see exactly what it drafted, why the policy decided what it decided, and what you (or your team) did with each suggestion.

How to start it

From a regular Terminal prompt (not from inside Whisper's interactive mode):

bash
whisper autopilot start

If you have multiple accounts, pass the account name:

bash
whisper autopilot start myaccount

You'll see the live cockpit boot up, do a one-time crash-recovery sweep, then start polling. Press Ctrl+C once to stop it cleanly.

Modes

Autopilot supports three modes via --mode:

ModeWhat it does
shadowDrafts replies and logs decisions, but never queues an approval or sends. Useful for evaluating Autopilot on your account before you let it touch anything.
draft_assist (default)Drafts and queues every reply for your approval. Nothing is ever sent automatically.
bounded_autoSame as draft_assist, but routine non-explicit replies can be sent without approval. Requires --auto-send as a deliberate second confirmation.
bash
whisper autopilot start --mode shadow
whisper autopilot start --mode draft_assist
whisper autopilot start --mode bounded_auto --auto-send

Useful flags

FlagWhat it does
--mode <name>One of shadow, draft_assist, bounded_auto (default draft_assist).
--auto-sendRequired for bounded_auto. Acts as a deliberate second confirmation that you understand auto-send is enabled.
--poll-ms <n>How often to check for unread messages (default 12 seconds).
--no-bellDisable the bell sound when a new approval needs attention.

Live cockpit behavior

When you run whisper autopilot start, your Terminal becomes a live cockpit. Each polling iteration prints a one-line summary:

  iter scanned=4 drafted=3 auto=0 queued=3 blocked=0 pending=3

Whenever Autopilot drafts a reply that needs your approval, the cockpit interrupts the polling loop and shows you the chat, the draft, and a prompt:

  @alice (12345) — 3 new messages, last 18m ago

  Latest from fan:
    "hey are you around tonight?"

  Draft:
    "Hey love! Just got in, what are you up to?"

  [A]pprove  [E]dit  [R]eject  [S]kip  [X]plain  [Q]uit >

Type a single letter and press Enter:

KeyAction
AApprove and send the draft as-is.
EEdit the draft. You'll be prompted to type a replacement; the message is sent after you confirm.
RReject. The draft is discarded and the conversation is marked rejected. Nothing is sent.
SSkip. The draft is set aside without rejecting. Useful when you want to come back to it later or let a teammate take it.
XExplain. Shows the reasoning behind this draft: which conversation patterns matched, which policy rules fired, and any risk flags. The prompt then comes back so you can decide.
QQuit the cockpit.

After each approval action, the cockpit goes back to polling. New approvals show up inline as they're ready.

Sound when an approval needs attention

When a new draft is ready for your approval, the cockpit plays a short attention sound (an ASCII bell plus a system sound where available) so you can step away from your computer and come back when Whisper actually needs you. The sound only plays once per polling iteration, not once per draft, so a batch of new approvals does not turn into a noisy stream.

If you'd rather work in silence, pass --no-bell when you start the cockpit:

bash
whisper autopilot start --no-bell

Or set the environment variable once for your shell:

bash
export WHISPER_AUTOPILOT_NO_BELL=1

The sound is also skipped automatically in two situations:

  • You are running the cockpit in silent mode (after pressing Ctrl+D).
  • Your Terminal is not attached to a real terminal (cron, SSH without a TTY, redirected output). In these cases the cockpit assumes nobody is listening.

Silent mode

If you want to keep Autopilot running but stop being interrupted (you're on a call, you're letting someone else handle approvals from the dashboard, you want overnight queueing), press Ctrl+D at the cockpit prompt.

Autopilot will keep polling, keep drafting, and keep queueing approvals to the cloud, but it will stop interrupting your Terminal. You'll see iteration summaries scroll by, but no inline prompts.

Silent mode is one-way for the current session. To go back to live approvals, quit (Ctrl+C) and run whisper autopilot start again, or drain the backlog with whisper autopilot review (next section).

Review and catch-up mode

If Autopilot queued approvals while you were in silent mode, or while you were offline, or while a teammate was running the cockpit, you can drain the backlog any time:

bash
whisper autopilot review

This opens the same approve / edit / reject / skip / explain prompt as the live cockpit, but only for the approvals already queued. There's no polling, no drafting; you just work through the list.

If your team uses Autopilot on multiple machines, add --reconcile so your local view picks up anything other operators already handled before you walked in:

bash
whisper autopilot review --reconcile

Status and stop commands

Quick check on what's happening:

bash
whisper autopilot status

You'll see the active run (if any), how long it's been up, the most recent iteration summary, and how many approvals are pending.

Cleanly stop any active runs and release locks:

bash
whisper autopilot stop

You don't usually need stop. Pressing Ctrl+C in the cockpit does the same thing. stop is for cleaning up after a crash, or stopping a run that was started on another machine.

What approval actions mean

ActionWhat happens to the draftWhat happens to the conversationWhen to use it
ApproveSent exactly as drafted.Marked approved.The draft is good as-is.
EditYou type a new version, then it's sent.Marked edited (Whisper learns from your edit over time).The draft is close but you want to tweak the tone, length, or specifics.
RejectDiscarded. Nothing is sent.Marked rejected. The conversation goes back into the normal flow; the next round of polling can draft a new reply.The draft is wrong (off-tone, off-topic, off-persona) and you don't want to send anything like it.
SkipSet aside. Nothing is sent right now.Marked skipped. The conversation is not redrafted automatically.You're not ready to decide. Comes up again in whisper autopilot review.
Explain(no change)(no change)You want to see why Whisper drafted what it drafted before making a decision.

Edits are how Autopilot learns your voice

Every time you edit a draft instead of approving it as-is, Whisper records the change. Over time, the system gets better at writing in your voice. Don't reject when an edit would do. The edit is more useful as a teaching signal.

Whisper learns your voice automatically

You never have to write a persona or describe how you talk. Whisper picks that up from the way you actually message, and it keeps getting better the more you use it. This happens on its own, with nothing to set up and nothing to run.

Here is what is going on behind the scenes:

  • Every edit is a lesson. When you tweak a draft instead of approving it as-is (shortening it, warming up the tone, swapping a phrase), Whisper notices the gap between what it wrote and what you actually sent.
  • It refines your voice on a schedule. From time to time, Whisper quietly tries out a more refined version of your voice and checks it against your recent edits, to see whether that version would have matched what you sent more closely.
  • It only keeps a change if it is better. If the refined version would not have helped, Whisper keeps the one it had. Your voice never gets worse from this, and you are never asked to approve it.
  • Every voice update has to earn its place. The same check guards more than the scheduled tweaks. Any time Whisper builds a fresh read of how you talk, that new version still has to beat the one you already have on your recent edits before it goes live. A brand-new account without enough history yet gets the fresh version right away, since there is nothing to compare against. Either way, the way Whisper writes for you only ever changes when the change has been shown to help.

The payoff is simple: the drafts you approve start needing fewer and fewer edits. There is no notification, no button, and no setting to manage. Whisper just quietly sounds more like you over time.

The most helpful thing you can do is edit, not reject

When a draft is close, edit it instead of rejecting it. An edit shows Whisper exactly what you would have sent, which is the single most useful signal for learning your voice. A reject only says "not this", with nothing to learn from. Edit the near-misses and your drafts get noticeably more like you week after week.

What bounded auto-send does and does not do

bounded_auto --auto-send enables a very narrow form of automatic sending. It's not "send everything for me". It's "send only the safe, routine stuff for me; still ask me about everything else".

Bounded auto-send will send replies automatically when all of the following are true:

  • The conversation is classified as a routine non-explicit message (small talk, check-in, friendly banter).
  • No risk flags fired (more on those below).
  • The thread is not under attack (no recent prompt-injection attempts on the conversation).
  • You explicitly passed --auto-send at startup.

Bounded auto-send will not send automatically (it queues an approval instead) for any of:

  • Adult or explicit content.
  • PPVs.
  • Custom requests.
  • Priced offers of any kind.
  • Anything that looks like an upsell, a schedule change, a vault reference, a first-contact offer, or pricing drift.
  • High-value subscribers (Whisper flags them so you handle them personally).
  • New objections it hasn't seen before.
  • Anything where the fan's intent is ambiguous.
  • Anything where personal facts came up that Whisper couldn't verify.
  • Anything triggered by a possible prompt-injection attempt.

If any of these fire, even with --auto-send, you get an approval prompt.

Why adult, explicit, PPV, custom, and priced content always requires approval in v1

In the first release, anything that touches money or sexual content gets your explicit approval. Every time. No exceptions, no override flag.

There are two reasons:

  1. Trust and revenue. Pricing decisions, custom requests, and PPV positioning are where the actual revenue is made. The cost of a bad auto-send on a $50 PPV is much higher than the cost of a slightly slower reply. We err on the side of "let the operator decide".
  2. Compliance. Platform rules around explicit content evolve. Keeping a human in the loop on every adult-context reply means you can adapt quickly without waiting for a software update.

Future versions may open up some of these categories under explicit configuration, with operator-set guardrails. For now, they're always approval-required. If you're frustrated by having to approve every PPV pitch, that's the system working as designed.

What "[FAILED — verify in OF before retrying]" means

Occasionally, when Whisper tries to send an approved message, the platform responds with an error that's ambiguous: the connection may have dropped after the message was already accepted, or the platform may have rejected the send. From the outside, there's no way to tell which.

In those cases, Whisper writes the approval as failed and marks it for human verification. You'll see it in whisper autopilot review like this:

  [FAILED — verify in OF before retrying] @alice  2026-05-26T17:30:00Z
    This send may have reached OF. Do not resend until
    you confirm the message is not already in the thread.
    Hey love! Just got in, what are you up to?

The cockpit will also show a one-line nudge in the iteration summary:

  ⚠ 1 send(s) may have reached OF — verify in OF before retrying. Run `whisper autopilot review`

Do not retry these blindly. The message may already be sitting in the fan's inbox. If you resend, the fan gets the same message twice.

How to recover from failed / needs human reconciliation rows

  1. Open the chat on your account directly (the actual platform UI, in a browser or the platform's app).
  2. Look at the most recent messages from you.
  3. If the message is already there, the send went through. Nothing to do. The failed row stays as a historical record of the ambiguous attempt; you can ignore it.
  4. If the message is not there, the send didn't go through. Send the message manually from the chat, or wait for Autopilot to redraft on its next polling pass.

Either way, the failed row stays in the audit log. You don't need to "clear" it. It just sits there as a reminder that you verified it. Future runs of whisper autopilot review will keep showing it under the "Needs human reconciliation" section until enough time has passed for it to scroll off.

Never delete failed rows from a database

The failed-row state is intentional. It's a permanent audit trail of the ambiguous attempt. If you're tempted to "clean up" these rows manually, don't. They're harmless, and they're the only record that an ambiguous error ever happened.

How multiple operators can safely work the same account

Autopilot is built for teams. Multiple people can run whisper autopilot start on the same account from different machines, at the same time, without stepping on each other.

Here's how the coordination works:

  • Locks. When one operator's daemon starts drafting for a conversation, it takes a short-lived lock. No other operator's daemon will draft for that conversation while the lock is held. Locks expire automatically after a couple of minutes if the operator walks away.
  • Approval claims. When you press A to approve, your machine claims the approval in the cloud before any send happens. If your teammate hit A at the same moment, only one of you wins the race. The other one sees "currently being sent by ..." and the send happens exactly once. No double messages.
  • Crash recovery. If your machine crashes mid-send, the next Autopilot daemon that starts up (yours, or any teammate's) will look at the conversation, check whether the message actually made it through, and either mark the send done or flag it for verification. You never end up with a silent half-sent state.
  • No double messages. The combination of locks and claims means a given approval can only be sent once. Even if three of you press A at the exact same moment on three different machines, only one send happens.

For more on team coordination across all of Whisper, see Team Collaboration.

Run it where you have a stable connection

Autopilot is a long-running daemon. It's happiest on a machine with a steady internet connection and a Terminal you don't close. A laptop you carry around works fine, but if you put it to sleep mid-iteration, the polling stops until you wake it back up. The crash-recovery sweep on next startup will sort out any in-flight send.