> For the complete documentation index, see [llms.txt](https://mercure-technologies.gitbook.io/expo-open-ota/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mercure-technologies.gitbook.io/expo-open-ota/getting-started.md).

# Getting Started

## How Expo Open OTA works

Before you begin, understand the services and release concepts below.

Then choose the operating mode that fits your deployment.

Expo Open OTA combines a CLI, an OTA server, and a dashboard.

The CLI publishes updates. The server stores and delivers them. The dashboard provides visibility and management.

```mermaid
flowchart LR
    CLI["eoas CLI"] -->|publish, roll back, republish| S["Expo Open OTA server"]
    D["Dashboard"] -->|management API| S
    A["expo-updates client"] -->|manifest and assets| S
    S --> ST[("Update storage / CDN")]
    S -.->|Stateless mode| E["Expo API"]
    S -->|Control plane mode| DB[("PostgreSQL")]
```

### `eoas` CLI

[`eoas`](https://www.npmjs.com/package/eoas) is the Expo Open OTA npm package.

Run it locally or in CI. It communicates directly with your Expo Open OTA server.

Use it to publish updates, roll back releases, and republish an existing update.

### Server

The server handles update operations requested by `eoas`. It also implements the [Expo Updates protocol](https://docs.expo.dev/technical-specs/expo-updates-1/).

The app uses two main endpoint types:

* `/manifest` checks for an update and returns its manifest.
* `/assets` serves bundle assets or redirects to a configured CDN.

The manifest identifies the update and its required assets. The app then downloads those assets before applying the update.

### Dashboard

The dashboard uses the server API to inspect and manage OTA delivery.

In **Stateless mode**, it shows updates, configuration, and release-channel mappings. Expo remains the source of truth.

In **Control plane mode**, it becomes a full release-management center. Manage apps, branches, channels, access tokens, and updates from one place.

### Core release concepts

Every installed app uses a release channel. Published updates belong to branches. A channel-to-branch mapping decides which update line the app receives.

This separation enables safe promotion, progressive rollouts, and future A/B testing.

Read [Branches and release channels](/expo-open-ota/getting-started/branches-and-release-channels.md) for the complete model.

### Choose an operating mode

Now choose one of two deployment paths:

* [Control plane mode](/expo-open-ota/controle-plane-mode/overview.md) manages releases independently with PostgreSQL.
* [Stateless mode](/expo-open-ota/stateless-mode/overview.md) keeps Expo as the release-management source of truth.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://mercure-technologies.gitbook.io/expo-open-ota/getting-started.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
