You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+21-16Lines changed: 21 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -40,30 +40,35 @@
40
40
41
41
[](https://railway.com/deploy/MGW3k1?referralCode=OEHlEK&utm_medium=integration&utm_source=template&utm_campaign=generic)
42
42
43
-
🚀 **An open-source Go implementation of the Expo Updates protocol, designed for production with support for cloud storage like S3 and CDN integration, delivering fast and reliable OTA updates for React Native apps.**
43
+
Or with Docker:
44
44
45
-
## ⚠️ Disclaimer
45
+
```bash
46
+
docker run -p 3000:3000 \
47
+
-e STORAGE_MODE=s3 \
48
+
-e S3_BUCKET_NAME=my-bucket \
49
+
-e AWS_REGION=us-east-1 \
50
+
axelmarciano/expo-open-ota
51
+
```
46
52
47
-
**Expo Open OTA is not officially supported or affiliated with [Expo](https://expo.dev/).**
48
-
This is an independent open-source project.
53
+
Then configure your Expo app to point to your server — see the [full documentation](https://axelmarciano.github.io/expo-open-ota/).
Copy file name to clipboardExpand all lines: apps/docs/docs/getting-started/introduction.mdx
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ sidebar_position: 1
4
4
5
5
# Introduction
6
6
7
-
**Expo Open OTA** is an open-source project that allows you to host your own updates server for your Expo application. It is a self-hosted alternative to the official Expo OTA service, implementing the [Expo Updates protocol](https://docs.expo.dev/technical-specs/expo-updates-1/).
7
+
**Expo Open OTA** is an open-source, multi-cloud OTA update server for Expo and React Native applications. It implements the [Expo Updates protocol](https://docs.expo.dev/technical-specs/expo-updates-1/) and supports **AWS S3**, **Google Cloud Storage**, and any **S3-compatible** provider (Cloudflare R2, MinIO, DigitalOcean Spaces).
8
8
9
9
:::warning
10
10
**Expo Open OTA** is not affiliated with Expo. It is an independent open-source project.
@@ -30,10 +30,10 @@ When an update is available, a list of assets is sent back to the client. These
30
30
- Signs and compresses the files.
31
31
- Returns the required assets to the Expo client.
32
32
33
-
If a CDN is configured, the returned URL is a pre-signed link pointing to a cdn endpoint. Otherwise, the server returns the asset directly.
33
+
If a CDN is configured (CloudFront) or if using GCS, the returned URL is a pre-signed/signed link and the client downloads directly from the storage provider. Otherwise, the server returns the asset directly.
34
34
35
35
### 3. `/requestUploadUrl` & `/uploadLocalFile`
36
-
These routes are used by the `eoas` package to publish updates to the chosen storage solution, whether it's S3 or a local file system.
36
+
These routes are used by the `eoas` package to publish updates to the chosen storage solution, whether it's S3, Google Cloud Storage, or a local file system.
37
37
`/uploadLocalFile` is used to upload the file to the server when [storage mode](/docs/server-configuration/storage?storage=local) is set to `local`.
The service account must have at minimum `storage.objectCreator` and `storage.objectAdmin` permissions on your bucket. You don't need to make objects public — the server generates short-lived signed URLs for all file access.
93
+
7. Set the output as `GOOGLE_APPLICATION_CREDENTIALS_B64` in your `.env`
94
+
95
+
:::tip
96
+
The base64 credential is used both for authenticating API calls (read, write, delete objects) and for generating signed URLs.
97
+
:::
98
+
99
+
#### How asset delivery works
100
+
101
+
Unlike S3 where you can optionally configure CloudFront as a CDN, GCS uses **direct signed URLs** for asset delivery. When a client requests an update asset, the server generates a short-lived signed URL (15 minutes) and redirects the client to download the file directly from GCS — the server never proxies the file content itself.
102
+
103
+
This is automatic when `GOOGLE_APPLICATION_CREDENTIALS_B64` is set. No additional CDN configuration is needed.
104
+
105
+
#### Permissions
106
+
107
+
The service account needs at minimum the **Storage Admin** role on your bucket. This covers:
108
+
-`storage.objects.get` — reading objects
109
+
-`storage.objects.list` — listing branches, runtime versions, and updates
Copy file name to clipboardExpand all lines: apps/docs/docusaurus.config.ts
+3-3Lines changed: 3 additions & 3 deletions
Original file line number
Diff line number
Diff line change
@@ -7,7 +7,7 @@ import type * as Preset from '@docusaurus/preset-classic';
7
7
constconfig: Config={
8
8
title: 'Expo Open OTA',
9
9
tagline:
10
-
'An open-source Go implementation of the Expo Updates protocol, designed for production with support for cloud storage like S3 and CDN integration, delivering fast and reliable OTA updates for React Native apps.',
10
+
'Self-hosted Expo updates for React Native. Multi-cloud (AWS S3, Google Cloud Storage), CDN-ready, and production-grade — an open-source Go server implementing the Expo Updates protocol.',
11
11
favicon: 'img/favicon.ico',
12
12
scripts: [
13
13
{
@@ -48,7 +48,7 @@ const config: Config = {
48
48
// Please change this to your repo.
49
49
// Remove this to remove the "edit this page" links.
Copy file name to clipboardExpand all lines: apps/docs/src/components/HomepageFeatures/index.tsx
+6-7Lines changed: 6 additions & 7 deletions
Original file line number
Diff line number
Diff line change
@@ -10,30 +10,29 @@ type FeatureItem = {
10
10
11
11
constFeatureList: FeatureItem[]=[
12
12
{
13
-
title: '⚙️ Ready for production in 10 minutes',
13
+
title: '⚙️ Production-ready in 10 minutes',
14
14
description: (
15
15
<>
16
-
No database, no complex setup—Expo Open OTA is designed for seamless production use. It fully leverages Expo’s configuration, handling <strong>release channels</strong>, <strong>branches</strong>, and <strong>runtime version fingerprints</strong> out of the box. Just connect your cloud storage (S3) and you're ready to go!
16
+
No database, no complex setup. Connect your cloud storage — <strong>AWS S3</strong>, <strong>Google Cloud Storage</strong>, or any S3-compatible provider — and you’re live. Handles release channels, branches, and runtime versions out of the box.
17
17
</>
18
18
),
19
19
},
20
20
{
21
-
title: '🚀 EOAS: One Command to Publish & Configure',
21
+
title: '🚀 One Command to Publish',
22
22
description: (
23
23
<>
24
-
Say goodbye to manual setup! Our <code>eoas</code>NPM package automates everything—run <code>npx eoas init</code> to configure your project, and <code>npx eoas publish</code> to push updates effortlessly from your CI/CD pipeline. No extra scripts, no hassle.
24
+
The <code>eoas</code>CLI automates everything — run <code>npx eoas init</code> to configure your project, and <code>npx eoas publish</code> to push updates from your CI/CD pipeline. No extra scripts, no hassle.
25
25
</>
26
26
),
27
27
},
28
28
{
29
-
title: '⚡ CDN Delivery',
29
+
title: '⚡ Fast Asset Delivery',
30
30
description: (
31
31
<>
32
-
Your assets, delivered at lightning speed. Expo Open OTA serves static assets through a CDN for maximum performance. Currently supporting AWS CloudFront, with upcoming support for Cloudflare and more—so your users get updates instantly, wherever they are.
32
+
Assets served at the edge. Deliver updates via <strong>CloudFront CDN</strong> or <strong>GCS signed URLs</strong> — your users get updates instantly, wherever they are. No public bucket access needed.
0 commit comments