# Deploy in a monorepo

Deploying Mastra in a monorepo follows the same process as a standalone application. This guide covers monorepo-specific considerations. For the core build and deployment steps, see [Deploy a Mastra Server](https://mastra.ai/docs/deployment/mastra-server).

## Supported monorepos

Mastra works with:

- npm workspaces
- pnpm workspaces
- Yarn workspaces
- Turborepo

Known limitations:

- Bun workspaces - partial support; known issues
- Nx - You can use Nx's [supported dependency strategies](https://nx.dev/concepts/decisions/dependency-management) but you need to have `package.json` files inside your workspace packages

## Example structure

In this example, the Mastra application is located at `apps/api`:

```text
apps/
├── api/
│   ├── src/
│   │   └── mastra/
│   │       ├── agents/
│   │       ├── tools/
│   │       ├── workflows/
│   │       └── index.ts
│   ├── package.json
│   └── tsconfig.json
└── web/
packages/
├── ui/
└── utils/
package.json
```

## Building from a monorepo

Use your monorepo tool to run the build command from the correct package. There's no need for special flags.

Examples:

**npm**:

```bash
npm run build --workspace=apps/api
```

**pnpm**:

```bash
pnpm --filter api run build
```

**yarn**:

```bash
yarn workspace api build
```

**Turborepo**:

```bash
turbo run build --filter=api
```

Your package's `build` script should run `mastra build`:

```json
{
  "scripts": {
    "build": "mastra build"
  }
}
```

## Workspace packages

When your Mastra application imports from other workspace packages, Mastra handles this automatically:

- If the package is pre-compiled (e.g., built with `tsc` or `tsdown`), Mastra imports the compiled JavaScript
- If the package contains uncompiled TypeScript, Mastra transpiles it during the build

For most setups, this works without configuration. If you encounter issues with workspace package imports, add the package to [`transpilePackages`](https://mastra.ai/reference/configuration):

```typescript
export const mastra = new Mastra({
  bundler: {
    transpilePackages: ['@my-org/utils'],
  },
})
```

## Environment variables

Store `.env` files in the Mastra application directory (e.g., `apps/api/.env`), not the monorepo root.

## Deployment configuration

When deploying to cloud providers, ensure the correct package is selected as the deploy target. Selecting the monorepo root instead of the application directory (e.g., `apps/api`) is a common mistake.

Most providers let you specify the root directory in their dashboard or configuration file.

## Dependency management

Keep dependencies consistent to avoid version conflicts and build errors:

- Use a **single lockfile** at the monorepo root so all packages resolve the same versions
- Align versions of **shared libraries** (like Mastra or frameworks) to prevent duplicates

## Troubleshooting

### Workspace package not found

If Mastra can't resolve a workspace package, ensure:

- The package is listed in your `package.json` dependencies
- Your lockfile is up to date (`pnpm install`, `npm install`, etc.)
- The package has a valid `main` or `exports` field in its `package.json`

### TypeScript errors from workspace packages

If you see type errors from uncompiled workspace packages, either:

- Build the package first (recommended for faster Mastra builds)
- Add the package to [`transpilePackages`](https://mastra.ai/reference/configuration) in your Mastra config

## Related

- [Deploy a Mastra Server](https://mastra.ai/docs/deployment/mastra-server) - Core build and deployment guide
- [Configuration Reference](https://mastra.ai/reference/configuration) - `bundler.transpilePackages` and other options
- [CLI Reference](https://mastra.ai/reference/cli/mastra) - Build command flags