PHPackages                             timgws/laravel-expo-updates - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. timgws/laravel-expo-updates

ActiveLibrary[API Development](/categories/api)

timgws/laravel-expo-updates
===========================

Laravel package for handling Expo Updates protocol

00

Since May 12Compare

[ Source](https://github.com/timgws/laravel-expo-updates)[ Packagist](https://packagist.org/packages/timgws/laravel-expo-updates)[ RSS](/packages/timgws-laravel-expo-updates/feed)WikiDiscussions Synced 3w ago

READMEChangelogDependenciesVersions (1)Used By (0)

 [![](https://github.com/timgws/laravel-expo-updates/raw/development/assets/expo_updates_icon.png)](https://github.com/timgws/laravel-expo-updates/raw/development/assets/expo_updates_icon.png)### Laravel Expo Updates

[](#laravel-expo-updates)

 ⚓ Ship like you mean it 💥

```
# composer require timgws/laravel-expo-updates
```

What is Laravel Expo Updates?
-----------------------------

[](#what-is-laravel-expo-updates)

A lightweight Laravel package that lets you **self-host over-the-air (OTA) updates** for React Native apps using the **Expo Updates protocol**.

It takes care of the boring parts (manifest generation, asset serving, protocol compliance) so your existing Laravel backend becomes the control plane for fast, reliable updates.

`expo-updates` is a React Native library that enables your app to manage remote updates to your application code. It communicates with the configured remote update service to get information about available updates.

`Laravel Expo Updates` is designed to be a PHP implementation of the [Expo Updates protocol](https://docs.expo.dev/technical-specs/expo-updates-1/), making it compatible with any React Native app using the `expo-updates` library. If you write your app's backend in PHP, this package lets you keep everything in one stack.

### Why use it?

[](#why-use-it)

- **One stack**: Keep everything server-side in PHP/Laravel. Simpler infrastructure, fewer moving parts.
- **Self-hosted**: Own your release cadence, storage, and logs.
- **Full control**: Gate who gets which updates and when.

Reporting Bugs
--------------

[](#reporting-bugs)

Spotted a bug? Thanks for helping improve Laravel Expo Updates! [Please open a GitHub issue](../../issues/new?labels=bug).

Installation (Server Side)
--------------------------

[](#installation-server-side)

You can install the package via composer:

```
composer require timgws/laravel-expo-updates
```

After installing the package, publish the configuration file:

```
php artisan vendor:publish --provider="LaravelExpoUpdates\ExpoUpdatesServiceProvider" --tag="config"
```

Run the migrations:

```
php artisan migrate
```

Server side configuration
-------------------------

[](#server-side-configuration)

Sane defaults are provided, but you should review and adjust the configuration file that is published to your config folder.

The configuration file is located at `config/expo-updates.php`. Here you can configure:

- Route prefix for the update endpoints
- Code signing settings
- Asset storage settings
- Cache settings

Make sure to set the appropriate environment variables in your `.env` file. Here are the relevant variables:

```
# cat .env | grep ^EXPO_
EXPO_UPDATES_ROUTE_PREFIX=updates
EXPO_UPDATES_DEFAULT_PROJECT=default
EXPO_UPDATES_CODE_SIGNING_ENABLED=true
EXPO_UPDATES_CERTIFICATE_PATH=app/expo-updates/public.key
EXPO_UPDATES_PRIVATE_KEY_PATH=app/expo-updates/private.key
EXPO_UPDATES_SIGNATURE_CACHE_ENABLED=true
EXPO_UPDATES_SIGNATURE_CACHE_TTL=600
EXPO_UPDATES_ASSETS_DISK=local
EXPO_UPDATES_ASSETS_PATH=expo-updates/assets
EXPO_UPDATES_ASSETS_URL=https://www.myapplication.com/assets/
EXPO_UPDATES_CACHE_ENABLED=true
EXPO_UPDATES_CACHE_TTL=60
```

Installation (Client Side)
--------------------------

[](#installation-client-side)

Check out the [expo-updates configuration guide](https://docs.expo.dev/versions/latest/sdk/updates/#usage).

Warning

`updates.url` must point to  (note the /api/manifest path). Pointing to the site root will return HTML, not a manifest.

Replacing the default models
----------------------------

[](#replacing-the-default-models)

The package comes with default Eloquent models for `Update`, `Asset`, and `Manifest`.

You can replace the default models by creating your own models that extend the package's models and updating the configuration file to use them.

Alternatively, you can create new implementations, as long as they fulfil the Interfaces provided.

Usage
-----

[](#usage)

### Routes

[](#routes)

The package automatically registers the following routes:

- `GET /expo-updates/manifest` - Returns the latest manifest for the specified platform and runtime version
- `GET /expo-updates/asset/{key}` - Serves an asset file

### Headers

[](#headers)

The manifest endpoint requires the following headers:

- `expo-protocol-version: 1`
- `expo-platform: ios|android`
- `expo-runtime-version: *`
- `accept: application/expo+json, application/json, multipart/mixed`

Optional headers:

- `expo-manifest-filters: *` - Filter manifests by metadata
- `expo-expect-signature: *` - Request code signing

### Code Signing

[](#code-signing)

To enable code signing:

1. Set `EXPO_UPDATES_CODE_SIGNING_ENABLED=true` in your `.env` file
2. Configure the paths to your certificate and private key: ```
    EXPO_UPDATES_CERTIFICATE_PATH=/path/to/certificate.pem
    EXPO_UPDATES_PRIVATE_KEY_PATH=/path/to/private.key

    ```

### Asset Storage

[](#asset-storage)

Assets are stored using Laravel's storage system. By default, they are stored in the `public` disk under the `expo-updates` directory. You can configure this in the config file.

### Quick checks &amp; commands

[](#quick-checks--commands)

Confirm the manifest route is registered:

```
php artisan route:list | grep -i manifest

```

Fetch the manifest like the client would (adjust headers/values as needed):

```
curl -i \
-H "Accept: application/expo+json" \
-H "Expo-Platform: ios" \
-H "Expo-Runtime-Version: 1.0.0" \
-H "Expo-Channel-Name: production" \
https://your-domain.example/api/manifest

```

Note

If you receive HTML instead of JSON, you’re likely hitting the wrong path or an HTML middleware. Double-check the URL and route group.

License
-------

[](#license)

This project is licensed under the terms of the MIT license (MIT). Please see [License File](LICENSE.md) for more information.

###  Health Score

9

—

LowBetter than 0% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity0

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity12

Early-stage or recently created project

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/e950378ef4ed66fb3df70c8b59a7bf9ba5df39c8b6be3f85a4ae484af4992d77?d=identicon)[timgws](/maintainers/timgws)

### Embed Badge

![Health badge](/badges/timgws-laravel-expo-updates/health.svg)

```
[![Health](https://phpackages.com/badges/timgws-laravel-expo-updates/health.svg)](https://phpackages.com/packages/timgws-laravel-expo-updates)
```

###  Alternatives

[exsyst/swagger

A php library to manipulate Swagger specifications

35916.4M7](/packages/exsyst-swagger)[hubspot/api-client

Hubspot API client

24016.2M20](/packages/hubspot-api-client)[pocketmine/bedrock-protocol

An implementation of the Minecraft: Bedrock Edition protocol in PHP

172445.0k18](/packages/pocketmine-bedrock-protocol)[botman/driver-telegram

Telegram driver for BotMan

93459.5k6](/packages/botman-driver-telegram)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
