---
modificationDate: April 02, 2026
title: Build lifecycle hooks
description: Learn how to use the EAS Build lifecycle hooks with npm to customize your build process.
---

<AgentInstructions>

## Submitting Feedback

If this page contains errors, outdated information, or gaps that blocked you from completing a task, report it so the docs can be improved:

curl -X POST https://api.expo.dev/v2/feedback/docs-send -H 'Content-Type: application/json' -d '{"url":"/build-reference/npm-hooks/","feedback":"🤖 Agent feedback: <specific, actionable description>"}'

Only submit when you have something specific and actionable to report.

</AgentInstructions>

# Build lifecycle hooks

Learn how to use the EAS Build lifecycle hooks with npm to customize your build process.

> For the complete documentation index, see [llms.txt](/llms.txt). Use this file to discover all available pages.

EAS Build lifecycle npm hooks allows you to customize your build process by running scripts before or after the build process.

> For better understanding, see the [Android build process](/build-reference/android-builds) and the [iOS build process](/build-reference/ios-builds).

> The lifecycle hooks are not executed by the build process in [custom builds](/custom-builds/get-started). They need to be manually extracted and called by the build steps during the process.

## EAS Build lifecycle hooks

There are six EAS Build lifecycle npm hooks available. To use, them, you can set them in your **package.json**.

| Build Lifecycle npm hook | Description |
| --- | --- |
| `eas-build-pre-install` | Executed before EAS Build runs `npm install`. |
| `eas-build-post-install` | The behavior depends on the platform and project type. For Android, runs once after the following commands have all completed: `npm install` and `npx expo prebuild` (if needed). For iOS, runs once after the following commands have all completed: `npm install`, `npx expo prebuild` (if needed), and `pod install`. |
| `eas-build-on-success` | This hook is triggered at the end of the build process if the build was successful. |
| `eas-build-on-error` | This hook is triggered at the end of the build process if the build failed. |
| `eas-build-on-complete` | This hook is triggered at the end of the build process. You can check the build's status with the `EAS_BUILD_STATUS` environment variable. It's either `finished` or `errored`. |
| `eas-build-on-cancel` | This hook is triggered if the build is canceled. |

An example of how a **package.json** can look when using one or more lifecycle hooks:

```json
{
  "name": "my-app",
  "scripts": {
    "eas-build-pre-install": "echo 123",
    "eas-build-post-install": "echo 456",
    "eas-build-on-success": "echo 789",
    "eas-build-on-error": "echo 012",
    "eas-build-on-cancel": "echo 345",
    "start": "expo start",
    "test": "jest"
  },
  "dependencies": {
    "expo": "56.0.0"
    ... 
  }
}
```

## Platform-specific hook behavior

To run a script (or some part of a script) only for Android or iOS builds, you can fork the behavior depending on the platform within the script. See the following common examples to do this through a shell script or a Node script.

### Examples

#### package.json and shell script

```json
{
  "name": "my-app",
  "scripts": {
    "eas-build-pre-install": "./pre-install",
    "start": "expo start"
    ... 
  },
  "dependencies": {
    ... 
  }
}
```

```bash
#!/bin/bash

# This is a file called "pre-install" in the root of the project

if [[ "$EAS_BUILD_PLATFORM" == "android" ]]; then
  echo "Run commands for Android builds here"
elif [[ "$EAS_BUILD_PLATFORM" == "ios" ]]; then
  echo "Run commands for iOS builds here"
fi
```

Example: Pre-install script that installs `git-lfs` on macOS workers

The following script installs [`git-lfs`](https://git-lfs.com/) if it is not yet installed. This is useful in some cases where `git-lfs` is required to install certain CocoaPods.

```bash
if [[ "$EAS_BUILD_PLATFORM" == "ios" ]]; then
  if brew list git-lfs > /dev/null 2>&1; then
    echo "=====> git-lfs is already installed."
  else
    echo "=====> Installing git-lfs"
    HOMEBREW_NO_AUTO_UPDATE=1 brew install git-lfs
    git lfs install
  fi
fi
```

#### package.json and Node script

```json
{
  "name": "my-app",
  "scripts": {
    "eas-build-pre-install": "node pre-install.js",
    "start": "expo start"
    // ...
  },
  "dependencies": {
    // ...
  }
}
```

```js
// Create a file called "pre-install.js" at the root of the project

if (process.env.EAS_BUILD_PLATFORM === 'android') {
  console.log('Run commands for Android builds here');
} else if (process.env.EAS_BUILD_PLATFORM === 'ios') {
  console.log('Run commands for iOS builds here');
}
```
