Breethly — Wellness Platform
A multi-tenant wellness platform with separate consumer and corporate experiences running on a shared design system and a single codebase.
Breethly is building a new category it calls Nervous System Fitness — breath-sensing hardware, real-time biofeedback, and an adaptive BreathOS engine. That product serves two audiences from one codebase: individuals at breethly.com, and companies at corporate.breethly.com rolling it out to their people. The experiences need to feel distinct yet stay one brand — and be maintainable by a small team without duplicating everything.
The challenge
Multi-tenant done badly becomes two products in a trench coat: forked code, drifting UI, double the bugs. Done well, the consumer marketing-and-commerce surface and the corporate investor-and-B2B surface share their foundations while differing exactly where they should. The platform needed clean tenant boundaries, a single brand system spanning a deliberate palette and a four-typeface stack, and an architecture that keeps the two apps from diverging over time.
The approach
We organized the codebase as a Turborepo monorepo in TypeScript, with two Next.js App Router apps — @breethly/consumer and @breethly/corporate — drawing from a shared @breethly/ui package and a common config package. Filtered dev tasks let either app run in isolation; shared logic and components mean a fix lands once and propagates everywhere. The brand language — Funnel Display and Schibsted Grotesk type, the navy-to-chartreuse palette, taglines like “Science You Can Feel” — is encoded in the design system so both surfaces read as one company.
What we built
- A Turborepo workspace with
apps/consumer,apps/corporate, and sharedpackages/uiandpackages/config - The consumer app’s marketing-and-commerce routes — Science, Features, Stories, and About — built on the App Router
- The corporate app’s company surface — Corporate Wellness, Team, and Investors — sharing the same component library
- A shared
@breethly/uicomponent kit: Header, Footer, Section, Card, Accordion, Tabs, Modal, Badge, Button, Input, and an AnimatedText primitive - A unified token system (the Breethly palette and typography) wired through a shared Tailwind config so both apps stay on-brand
- Per-app filtered dev/build pipelines (
dev:consumer,dev:corporate) for independent iteration without forking code
The outcome
Breethly runs two coherent experiences from one well-structured platform — easier to maintain, consistent to use. That structural discipline is what separates software that scales from software that sprawls, and it’s the standard we hold across every build.