> ## Documentation Index
> Fetch the complete documentation index at: https://docs.autogrowth.farm/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> AutoGrowth runs social accounts on real phones. Everything a page describes happens on a physical device in the customer's own fleet, never through a social platform's API.
> The Companion is a macOS desktop app that runs on the customer's own Mac and manages the phones over USB — iPhones through WebDriverAgent, GrapheneOS phones through ADB and scrcpy. Nothing runs while the Companion is closed.
> The Companion builds, signs and installs WebDriverAgent on each iPhone itself. Never tell a customer to sign WebDriverAgent by hand in Xcode; Xcode is a prerequisite the Companion drives, not a step the customer performs.
> Autogrowth MAX is a one-time, invite-only lifetime license bought from the organization's credit balance, not a subscription tier. It is required to run any automation, workflow or Incubator program. Without a price set for that organization, the purchase is refused.
> An automation is one of AutoGrowth's built-in definitions; a script is a graph the customer builds in the Script Builder. The Script Builder is locked platform-wide, so never present building a script as something a customer can do today.
> An API key is a bare 64-character hex string with no prefix. It is shown once, at creation, is sent as `Authorization: Bearer <key>`, and can never be read back.
> An API key sees only the key owner's own accounts, content, collections, prompts, scripts and executions. Devices and tags are organization-scoped, and a non-owner sees only the devices assigned to them or carrying one of their tags. The automation catalog is global.
> There is no pagination. List endpoints return the whole set; the only limiting parameter anywhere is `limit` on `GET /v1/executions`, which defaults to 50 and has no offset to page with.
> Remote control and the live screen are dashboard-only, over WebSocket and MJPEG. Neither is part of the public API.
> The MCP server is hosted at https://mcp.autogrowth.farm and authenticates with OAuth. It is not an npm package and there is nothing to install locally. Its tools inherit exactly the scope of the API key behind them.
> Android support is partial and GrapheneOS-only: those phones appear in the fleet and can be watched and remote-controlled, but they cannot run scripts or automations.
> Never document Hi Katie or any persona feature. When a page and the code disagree, the code wins — check a claim against the source before repeating it.

# Containers

> Run several accounts on one phone by giving each account its own isolated app install.

A **container** is an isolated app install on one phone: its own copy of the app, its own
login, its own proxy. Ten containers on one iPhone look like ten separate phones to
Instagram.

Without containers, a phone has exactly one identity. The dashboard says so on a phone
that has none:

> Vanilla device — Containers are only available on jailbroken devices. Vanilla devices
> share a single device identity across all accounts.

Containers live on the phone's **Containers** tab, in the device detail view on
[Fleet](/guides/your-fleet).

<Frame caption="The Containers tab of a DoritosLite phone.">
  <img src="https://mintcdn.com/autogrowth/XpowNsqf1wRaYnfV/images/dashboard-containers.png?fit=max&auto=format&n=XpowNsqf1wRaYnfV&q=85&s=2ef8f6f78a82c760df5ff4a45cb62869" alt="The Containers tab of a DoritosLite phone's detail view, listing containers in a table with columns for Container, Accounts, Proxy and Status" width="1600" height="992" data-path="images/dashboard-containers.png" />
</Frame>

## The two providers

Containers come from one of two products. Which one a phone uses depends on whether it
is jailbroken.

|                           | **Doritos**                                                         | **DoritosLite**                                                 |
| ------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------- |
| Needs a jailbroken iPhone | Yes                                                                 | No                                                              |
| Licence                   | One key for the whole organization, plus a seat per phone           | One key per phone                                               |
| Price                     | \$40 per seat, plus a monthly charge for Meta and Reddit containers | $400 per key, plus $10 per container per month                  |
| Apps                      | Several                                                             | **Instagram only**                                              |
| How quickly it reacts     | About 1.5 seconds                                                   | About 20 seconds, and only while Instagram is open on the phone |

GrapheneOS phones are a third case: their containers are the phone's own user profiles,
they are never billed, and they are covered [further down](#grapheneos-profiles).

## Doritos

Doritos is licensed once for the organization. Turn it on in **Settings**, under
jailbroken devices — a non-owner sees "Ask an organization owner to enable jailbroken
devices."

Each jailbroken phone then needs a **seat**. Seats are bought in
[Billing](/guides/billing) and sit in a pool until a phone claims one.

<Steps>
  <Step title="Install Doritos on the phone and enter the org key">
    The phone registers itself and binds by its serial number. The dashboard says
    it plainly: "no dashboard step needed. 'Link manually' is only for when that
    binding never lands."
  </Step>

  <Step title="Give the phone a seat">
    A phone that activated without one shows "Activated but not on a seat — assign
    one to unlock it", and the buttons read **Assign seat**, counting what is free
    in your pool, or **Buy & assign**. A phone with no seat left in the pool is
    blocked until it gets one.
  </Step>

  <Step title="Create containers">
    On the phone's Containers tab, use **New container**. You give a name prefix —
    the placeholder suggests `ig_account` — and a quantity between 1 and 50.
  </Step>
</Steps>

Without a licence, creating a container and switching container are both refused.

## DoritosLite

DoritosLite gives a non-jailbroken iPhone the same idea through a re-signed Instagram
build. One key, one phone, forever — and the dashboard repeats that in three places
because it cannot be undone.

<Steps>
  <Step title="Buy a key">
    DoritosLite keys are bought in [Billing](/guides/billing), one per phone.
  </Step>

  <Step title="Enable the phone">
    On the phone's card, press **Enable**. The dialog is titled **Enable
    DoritosLite**, subtitled "Containers on a non-jailbroken iPhone, Instagram
    only." Press **Enable DoritosLite** to mint the key.
  </Step>

  <Step title="Do the three things on the phone">
    The dialog lists them as **Sideload steps**: "Install the re-signed Instagram
    IPA on this phone." / "Open that Instagram build on the phone." / "Type the
    license key above into the activation prompt."
  </Step>

  <Step title="Wait for the phone to check in">
    Nothing else happens in the dashboard. Once someone enters the key on the
    handset, the panel turns green and reports that the phone has checked in, with
    the app version it is running. Its containers appear on the fleet card.
  </Step>
</Steps>

<Warning>
  **A DoritosLite key cannot be moved.** The dialog says: "This mints one license bound
  to this phone. Keys cannot be moved afterwards — if it gets typed into the wrong
  handset, revoke it and enable the right phone instead." Revoking is in the phone's
  DoritosLite panel: DoritosLite stops working on that phone within about 20 seconds,
  the key cannot be reused, and containers already created stay on record.
</Warning>

Two things about DoritosLite that surprise people:

* **A DoritosLite phone reads Offline most of the time, and that is correct.** It
  heartbeats about every 20 seconds, but only while Instagram is in the foreground. The
  panel spells it out: "A DL phone is offline whenever Instagram is backgrounded — this
  is normal, not an error."
* **Creating and switching go through the phone, but you drive them from the
  dashboard.** With the phone's Companion connected, **New container** creates a
  container on the phone — it opens Instagram itself, so nothing needs lining up on
  the handset first — and the **On this phone** list switches between containers with
  **Make active**. Without that connection the dashboard says so: "Not connected to
  this phone's Companion." The list shows what the phone last reported; **Refresh**
  asks it again. Proxies are stored in the dashboard and applied when the phone
  switches into the container.

Closing the enable dialog changes nothing; the key stays available from the phone's
DoritosLite panel until it is used.

## One account, one container

A container is only useful once an account is bound to it. On a DoritosLite phone that
is the **Account for** dialog on the container, which explains what it buys you:

> Runs scheduled for this account will switch the phone into this container first.

Bind every account you automate. An account with no container is scheduled without one,
and the run happens in whichever identity the phone happened to be left in — which is
how posts end up on the wrong account.

Several accounts can share a container, and an account already placed elsewhere is
marked "in another container" so you do not move it by accident.

<Info>
  **Interact with Post does not work on a DoritosLite phone.** If you need it on
  non-jailbroken hardware, it is not available today.
</Info>

## GrapheneOS profiles

On a GrapheneOS phone, a container is one of the phone's own user profiles. They sync
themselves:

> GrapheneOS user profiles — each one an isolated identity. A saved PIN lets the
> Companion unlock the profile after a remote switch.

The table lists **Profile**, **Accounts** and **Keyguard PIN**, with chips for `owner`,
`current` and `locked`. Profiles cannot be created, deleted or switched from this panel —
that happens on the phone, or from the
[remote control page](/guides/remote-control). Saving a PIN needs the *Remote control
devices* permission, because a stored PIN is the ability to unlock the phone from a
browser.

Use **Set PIN**, enter 4 to 16 digits, and press **Save**. You then get "PIN saved —
entered on the next profile switch".

<Warning>
  **The Companion tries a saved PIN once, and only once.** A wrong PIN is not retried,
  because repeated failures lock the phone out — and a locked-out GrapheneOS phone
  disappears from the tool entirely until someone unlocks it by hand, in the room. There
  is no remote recovery.

  Profiles protected by a pattern or a password cannot be unlocked remotely at all: only
  a numeric PIN can be typed in.

  Keyguard PINs are stored so the Companion can type them, which means they are stored
  in a readable form on our side. Treat them as shared credentials, not secrets.
</Warning>

## What to read next

<CardGroup cols={2}>
  <Card title="Accounts" icon="at" href="/guides/accounts">
    Bind an account to a phone and a container.
  </Card>

  <Card title="Credits and billing" icon="credit-card" href="/guides/billing">
    Seats, keys and what containers cost each month.
  </Card>
</CardGroup>
