Monorepos: multiple Vercel projects from one repository
CI/CD's own monorepo lesson covered building only what changed as a pipeline-level concern. Vercel has to solve a related but distinct problem: several genuinely separate deployable apps, living in one repository, each needing its own deployment history, domain, and environment variables.
Intermediate
2 min read
The setup: one repository, several Vercel projects
A monorepo holding several independently-deployable apps maps to several separate Vercel projects, each one connected to the same Git repository but configured with its own root directory (apps/marketing-site, say) telling Vercel which subfolder that particular project actually builds from. Each project gets its own deployment history, its own custom domain, its own environment variables — genuinely independent from the others, despite sharing one repository and one Git history.
Ignored builds: not redeploying a project nothing actually changed for
# In a project's "Ignored Build Step" setting:npx turbo-ignore marketing-site
Without configuration, every push to the repository would trigger a build for every project, even ones whose code didn't actually change — wasteful, and exactly the problem CI/CD's own monorepo lesson covers for a general pipeline, just needing its own Vercel-specific mechanism here. An "Ignored Build Step" script runs before a build starts and can exit early (skipping the build entirely) if the specific files that project cares about weren't touched by the current commit — tools like Turborepo's own turbo-ignore helper automate detecting this based on the monorepo's dependency graph, rather than a team manually maintaining a list of "which paths affect which project."
Shared packages: a real dependency graph, not just shared folders
When shared-ui changes, every app depending on it genuinely needs rebuilding — this is exactly why naive "ignore unless files in my own folder changed" logic is wrong for a real monorepo: a change to a shared package affects every consumer, and the ignore-script tooling above needs to understand the actual dependency graph (which Turborepo and similar tools track explicitly) rather than just watching one folder in isolation.
Why this differs from simply having multiple unrelated repositories
A monorepo's real advantage — atomic commits that touch a shared package and every app depending on it together, in one single commit/PR — only holds if the deployment tooling respects that same dependency graph. Treating each app's Vercel project as if it were connected to a completely separate repository (ignoring the shared-package relationship) would silently reintroduce exactly the cross-repository coordination problem a monorepo was adopted to avoid in the first place.