Skip to main content
MonorepoVercelTypeScriptShared LibrariesGitHub

Monorepo Strategy for Multi-App Ecosystems: How Blossend Ships 6 Platforms

How Blossend manages six platforms in a monorepo using Vercel's multi-project support. Shared libraries, independent deployments, code reuse strategy, and the architecture behind OpenMyPro + Noizz.io.

Pablo Diaz·Founder & CEO, Blossend Inc·Ex-Amazon AWS Engineer

See this stack in production. 150K+ users. six-figure ARR.

Free forever. Upgrade only when you're ready.

150K+ users · Ex-Amazon Engineer · Healthcare Innovation

No card charged today · 150K+ users · $0 to start

Running six platforms as a solo founder requires ruthless code reuse. Our monorepo strategy lets OpenMyPro, Noizz.io, Blossend.com, and three internal tools share authentication, UI components, and utility libraries while deploying independently. Here is the architecture that makes this possible.

Why Monorepo Over Polyrepo

The alternative to a monorepo is six separate repositories with shared code published as npm packages. I tried this approach for two months and abandoned it. The overhead of versioning, publishing, and syncing shared packages across six repos consumed more time than the features I was building. Every shared component change required a package publish, version bump, and update in all consuming repos.

A monorepo eliminates this entirely. Shared code changes are immediately available to all applications. TypeScript project references ensure type safety across app boundaries. A single git history provides full context for any change across the ecosystem.

Repository Structure

Our monorepo follows a simple structure. The apps directory contains each application: apps/openmypro, apps/noizz, apps/blossend, and three internal tools. The packages directory contains shared code: packages/ui for shared components, packages/lib for shared utilities, packages/config for shared TypeScript and ESLint configurations.

Each application in apps is a standalone Next.js project with its own next.config.ts, package.json, and deployment configuration. Applications import from packages using TypeScript path aliases. There is no build step for shared packages — TypeScript compiles them inline with the consuming application.

Shared UI Components

The packages/ui library contains components used across multiple platforms: buttons, cards, forms, navigation elements, and layout primitives. These components use Tailwind CSS classes and accept customization through props, not style overrides. This ensures visual consistency while allowing each platform to express its own brand identity.

The design system is intentionally small — about 25 components. Each component is used by at least two applications. We resist the urge to premature-abstract. A component does not graduate to the shared library until it is copy-pasted between apps for the second time. This prevents the shared library from becoming a dumping ground for single-use components.

Independent Deployments

Vercel's multi-project support is the key enabler for independent deployments. Each application in our monorepo is connected to a separate Vercel project. When code changes in apps/openmypro, only the OpenMyPro project rebuilds and deploys. Changes in packages/ui trigger rebuilds for all applications that import from it.

Vercel detects which files changed in each commit and intelligently decides which projects need redeployment. A change to a blog post data file only triggers the portfolio site rebuild. A change to the shared auth utility triggers rebuilds for all six applications. This selective deployment keeps build times low and prevents unnecessary redeployments.

Shared Authentication Library

Our most valuable shared library is the authentication module. It wraps Supabase Auth with our multi-app session management, role-based access control, and middleware configuration. Every application imports the same auth functions, ensuring consistent authentication behavior across the ecosystem.

When we added provider role verification to the auth middleware, the change was made once in packages/lib/auth and automatically applied to all six applications on their next deployment. In a polyrepo setup, this would have required six separate code changes, six PRs, and six deployments — any one of which could be forgotten.

Dependency Management

All applications share root-level dependencies for core packages: React, Next.js, TypeScript, and Tailwind CSS. This ensures version consistency across the ecosystem. Application-specific dependencies like Stripe (only used by OpenMyPro) live in the application's own package.json.

We update core dependencies monthly by bumping versions in the root package.json and running the full test suite across all applications. This prevents version drift where one app is on React 18 while another is on React 19 — a situation that makes shared components impossible.

Scaling Considerations

The monorepo approach works well up to about 10 applications and 50 developers in our estimation. Beyond that, build times and git clone sizes become prohibitive. For Blossend's six-platform, one-developer setup, it is ideal. The entire repository is under 500MB, git operations are instantaneous, and full rebuilds take under 3 minutes.

If we grow to the point where the monorepo becomes unwieldy, we would likely split into a federated architecture with Turborepo managing dependency graphs across repos. But that is a problem for a 50-person engineering team, not a solo founder.

Frequently Asked Questions

Why does Blossend use a monorepo for six platforms?

A monorepo eliminates the overhead of publishing, versioning, and syncing shared npm packages across repositories. Shared code changes are immediately available to all applications. TypeScript project references ensure type safety across boundaries. A single git history provides full context for changes across the ecosystem.

How do independent deployments work in a Vercel monorepo?

Each application connects to a separate Vercel project. Vercel detects which files changed per commit and only rebuilds affected projects. A shared library change triggers rebuilds for all importing apps. An app-specific change only rebuilds that app. This keeps build times low and prevents unnecessary deployments.

How does Blossend share code between applications?

Shared code lives in a packages directory: packages/ui for components, packages/lib for utilities, packages/config for configurations. Applications import via TypeScript path aliases with no separate build step. Components only graduate to shared libraries after being used by at least two applications.

Ready to find the right AI tool? Our AI matching finds it in 33 seconds.

150K+ users. 190+ providers. Book healthcare in 33 seconds — not 26 days.

150K+ users · Ex-Amazon Engineer · Healthcare Innovation

No card charged today · AI-powered matching · 33-second booking

Get Founder Insights Weekly

Startup lessons, technical deep dives, and behind-the-scenes of building a 14-platform ecosystem. No spam.

Join 150K+ people who found their provider. Start free today.

150K+ users. 190+ providers. Book healthcare in 33 seconds — not 26 days.

150K+ users · Ex-Amazon Engineer · Healthcare Innovation

No card charged today · Cancel anytime · strong LTV/CAC

Noizz helps you discover and compare the best new products and tools. Try it free →

Build your professional portfolio

Free to get started. No card charged today.

Get Started

Tools We Recommend

Find healthcare providers

AI-powered matching. Book a provider in 33 seconds.

Try OpenMyPro

Discover trending brands

Product Hunt-style brand discovery with AI insights.

Explore Brands

AI-Powered Healthcare Tech

The parent company behind OpenMyPro and the Blossend ecosystem.

Learn More

Ready to work together? Get in touch or explore our platforms.

More tools by the same team

Find Healthcare Providers Instantly

AI-powered matching. Book a therapist, trainer, or nutritionist in 33 seconds.

Try OpenMyPro Free

Work With Me

Get updates on new projects, tools, and tech insights.

No spam. Unsubscribe anytime.

Visit Blossend.com →

Explore the full portfolio of independent AI tools and editorial properties at blossend.com.