TL;DR
**Problem**: Vercel completely ignores custom `buildCommand` in `vercel.json` for pnpm monorepo deployment, causing TypeScript compilation to fail with TS2307 “Cannot find module” errors for workspace dependencies.
**Evidence**: Debug echo statements in buildCommand don’t appear in build logs, proving Vercel runs default build process instead of our custom Turborepo orchestration.
**Impact**: Manual deployments work (pre-built deps), CI deployments fail (needs to build workspace deps first).
**Need**: Community help to understand what we’re missing or if this is a known Vercel limitation.
-–
1. Problem Description
We have a pnpm monorepo using Turborepo with a Hono-based service (`heimdall`) that deploys to Vercel Edge Runtime. The service has workspace dependencies (`@workspace/sdk`, `@workspace/helpers`, etc.) that must be built before the main service.
Vercel Project Configuration
- **Root Directory**: `apps/heimdall`
- **Framework Preset**: Hono
- **Include files outside the root directory in Build Step**: Enabled
- **Node Version**: 22.x
File Structure
├── apps/
│ └── heimdall/
│ ├── package.json
│ ├── vercel.json # ← Custom buildCommand ignored
│ ├── tsconfig.json
│ └── src/
│ └── index.ts
├── packages/
│ ├── sdk/ # ← Workspace dependency
│ ├── helpers/ # ← Workspace dependency
│ └── transactional/ # ← Workspace dependency
├── turbo.json # ← Defines build dependency graph
└── pnpm-workspace.yaml
Configuration Files
**apps/heimdall/package.json**
{
“name”: “heimdall”,
“type”: “module”,
“scripts”: {
“build”: “tsc && vc build”
},
“dependencies”: {
“@workspaceworkspaceworkspaceworkspace/sdk”: “workspace:*”,
“hono”: “^4.8.5”
}
}
**apps/heimdall/vercel.json** (Being Ignored!)
{
“$schema”: “https://openapi.vercel.sh/vercel.json”,
“framework”: “hono”,
“buildCommand”: “echo \“build command used\” && cd ../../ && turbo build --filter=heimdall…”,
“installCommand”: “echo \“install command used\” && cd ../../ && pnpm install”
}
**apps/heimdall/tsconfig.json**
{
“compilerOptions”: {
“target”: “ESNext”,
“module”: “NodeNext”,
“strict”: true,
“skipLibCheck”: true,
“jsx”: “react-jsx”,
“jsxImportSource”: “hono/jsx”
},
“include”: [“src/**/*”]
}
**turbo.json** (Dependency Graph)
```json
{
“tasks”: {
“heimdall#build”: {
“depends@workspworkspacen”: [
“@worksp@wo@wkspacece/sdk#build”,
“@w@workspacer@workspacespace/helpers#build”,
“@workspace/transactional#build”
\],
“outputs”: [“dist/**”, “.vercel/output/**”]
}
}
}
```
2. What We’ve Tried
Testing Method
We use a simple `/api/v1/ping` endpoint that returns `{“message”:“pong”}` to verify deployments:
curl -H “x-vercel-protection-bypass: bypass” "https://<deploy_url>.vercel.app/api/v1/ping"
Attempted Solutions & Results
2.1 Standard vercel.json buildCommand
**Tried**: Basic buildCommand configuration
{
“buildCommand”: “turbo build --filter=heimdall…”
}
**Result**: Completely ignored - no execution in build logs
2.2 Navigation to Monorepo Root
**Tried**: Adding `cd ../..` based on community patterns
{
“buildCommand”: “cd ../../ && turbo build --filter=heimdall…”
}
**Result**: Still ignored - command never executes
2.3 Debug Echo Statements
**Tried**: Adding echo statements to verify execution
{
“buildCommand”: “echo \“build command used\” && cd ../../ && turbo build --filter=heimdall…”,
“installCommand”: “echo \“install command used\” && cd ../../ && pnpm install”
}
**Result**: **NO echo statements appear in build logs** - definitive proof commands are ignored
2.4 Framework Override
**Tried**: Explicit framework declaration to prevent auto-detection interference
{
“framework”: “hono”,
“buildCommand”: “…”
}
**Result**: No change - still ignored
2.5 Schema Declaration
**Tried**: Adding schema for proper validation
{
“$schema”: “https://openapi.vercel.sh/vercel.json”,
“buildCommand”: “…”
}
**Result**: No change - still ignored
Build Log Evidence
2025-08-11T02:11:39.823Z Running “vercel build”
2025-08-11T02:11:40.297Z Vercel CLI 44.7.3
2025-08-11T02:11:40.475Z > Detected Turbo. Adjusting default settings…
[… standard pnpm install process …]
2025-08-11T02:12:07.048Z Using TypeScript 5.8.3 (local user-provided)
2025-08-11T02:12:08.889Z Error: src/handlers/auth/magic-link-handlers.ts(1,32):
error TS2307: Cannot find module '@workspace/sdk/v1/auth/helpers/generate-otp-url'
**Key Observations**:
- NO echo statements from our buildCommand appear
- Vercel runs default build process: `“vercel build”`
- TypeScript compilation fails on workspace imports
- D@workspacep@workspacendencies installed correctly: `+ @workspace/sdk 0.0.0 ← ../../packages/sdk`
3. What We Haven’t Tried / Ruled Out
Confirmed Working
- **Local builds**: `pnpm turbo build --filter=heimdall…` works perfectly
- **Manual deployments**: `vercel deploy` from local machine works (uses pre-built deps)
- **Endpoint functionality**: `/api/v1/ping` returns proper JSON when deps are built
Ruled Out
- **File location**: vercel.json is correctly placed in `apps/heimdall/`
- **JSON syntax**: Schema validation passes, no syntax errors
- **Turborepo configuration**: Dependencies build in correct order locally
- **TypeScript config**: NodeNext module resolution works with explicit .js extensions
Haven’t Tried Yet
1. **ENABLE_VC_BUILD=1 environment variable**: Some posts mention this flag
2. **Removing Hono framework preset**: Let Vercel auto-detect without framework hints
3. **Using `builds` property**: Though deprecated, might force custom command execution
4. **Root-level package.json scripts**: Some suggest adding scripts at repo root
5. **Custom install command without buildCommand**: Test if installCommand alone works
Community Patterns We’ve Researched
Based on GitHub issues and community posts:
- **Issue**: Some users report buildCommand ignored with pnpm workspaces ([Discussion #5171]( Ignore build step · vercel/vercel · Discussion #5171 · GitHub ))
- **Pattern**: `cd ../.. && pnpm -F app build` is widely recommended
- **Issue**: Framework presets may override user configuration
- **Issue**: Vercel’s “Detected Turbo” auto-adjustment interferes with custom commands
4. The Ask - What Are We Missing?
We’ve exhausted most documented approaches and need community help:
Primary Questions
1. **Is buildCommand fundamentally incompatible** with Vercel’s new Turborepo detection?
2. **Should we abandon vercel.json** and use a different approach entirely?
3. **Are there undocumented flags or settings** that make buildCommand work in monorepos?
4. **Is this a known regression** in recent Vercel CLI versions (we’re using 44.7.3)?
Specific Evidence We Need
- **Working vercel.json examples** from successful pnpm+Turborepo+Vercel deployments
- **Build logs showing custom buildCommand execution** (our echo statements never appear)
- **Alternative approaches** that don’t rely on buildCommand
- **Vercel team confirmation** if this is expected behavior vs. bug
Our Environment
- **Vercel CLI**: 44.7.3
- **pnpm**: 10.4.1
- **Turborepo**: Latest
- **Node**: 22.x
- **Framework**: Hono (Edge Runtime)
- **TypeScript**: 5.8.3 with NodeNext module resolution
**Any help or insights would be greatly appreciated!** This seems like a fundamental issue affecting pnpm monorepo deployments to Vercel, and we’re hoping the community has found working solutions.