Señorío de Líbano
A winery, its shop and its CMS — three apps in one monorepo.
The winery already had a site; this is its replacement, built as a proper system
rather than a single codebase. The monorepo holds three apps — web-landing,
web-shop and a Sanity studio — plus five shared packages (config, cms,
ui, utils, wines).
Where each kind of data lives
The interesting decision is where each kind of data lives. Editorial and
catalogue content — wines, descriptions, shipping rules — belongs to the winery’s
own team, so it sits in Sanity where they can edit it without a deploy. Orders,
which need transactional integrity, live in Neon Postgres behind Drizzle. Stripe’s
Payment Element handles checkout. Everything visual flows from one @repo/ui
package — shipped as raw .tsx and compiled by each app — so the landing site and
the shop can’t drift apart.
A shape I keep reaching for
It’s the shape I reach for again and again: separate the content plane from the transactional plane, share the presentation layer, and let each app stay small.
