Skip to main content

Building your vertical on Umbraculum

Tier: Public
Status: v1.1 — RFC-0011 Wave 6 sync (2026-06-07)
Audience: integrators, ISVs, and in-house teams building product X on Umbraculum — especially when product X is not a brewery and you want to know how that differs from the reference vertical shipped in this repo.

Two questions this page answers

  1. "How do I start building my vertical on top of Umbraculum?"
  2. "I'm building product X and don't need brewery — how do I uninstall / omit it?"

Terminology (vertical, canonical, reference vertical): GLOSSARY.md. Ecosystem vocabulary and catalog: MODULES.md.


The Magento 2 mental model (parallel, not identity)

Many integrators learned ecommerce on Magento Open Source: install core, optionally install sample data, then ship your modules in a merchant project that is not the Magento core repo.

Umbraculum uses the same three-layer idea with different packaging today:

Magento 2 (familiar)Umbraculum (name)Typical homeIn umbraculum-dev today?
Magento Open Source core + framework (magento/product-community-edition, magento/framework, …)Horizontal platform — auth, workspace, billing, AI, i18n, shared layout, renderingVendor / platform repoYes — shared
Standard domain modules shipped with the suite (Catalog, Customer, Inventory, …) — peer domains, not "industry verticals"Canonical modulespim, mrp, wms, crm, automation, crpPlatform repoYes — shared
Magento_SampleData* modules (Luma demo products, widgets, …) — reference/demo, not your merchant productbrewery reference vertical — demo domain data, BeerJSON, brew-day UX, @umbraculum/brewery-* packagesShould be optional like sample dataCo-shipped in monorepo (see gap below)
Your agency modulevendor/module-acme-checkout, theme, integrations in the merchant projectYour vertical configurationcode: "distillery", @acme/distillery-*, your β slicesYour repo + your deployUsually no
composer require vendor/module-foo + enable module in config.phpPin @umbraculum/module-sdk + your vertical npm package; register at API/web/native bootMerchant / integrator stackTarget (partially manual today)
Disable / remove sample data modules; merchant stack without demo catalogOmit brewery from boot + schema + navIntegrator deploymentTarget (custom build today)

One-line parallel

Magento: composer require core → skip or remove sample data → add your modules in the merchant project.
Umbraculum (intent): depend on platform + canonical modules → omit reference vertical → register your vertical from your repo.

Where we are honest: Magento has had a clean optional sample-data story for years. Umbraculum's reference vertical is still wired like core in the stock monorepo build — that is a known product gap, not the long-term model. GLOSSARY.md FAQ #5; § Question 2 — Running without brewery (today vs target) below.

Practitioner context (stewardship, agency-owned stacks): design/ecosystem-case-study-adobe-magento.md. Odoo/Omnis "core vs vertical product" parallels: GLOSSARY.md §"Where code lives".


Question 1 — How do I start building my vertical?

What you are building

A vertical configuration (Tier 6) is your product — the industry-specific operator experience, seed data, prompts, and packages that sit on top of shared canonical modules. It is not a new canonical domain; it is not a fork of Umbraculum core.

Plain language: you use Umbraculum as backbone; you ship product X separately.

StepActionDetail
0Read vocabularyGLOSSARY.md, MODULES.md §2
1Study the worked examplemodules/verticals/brewery/README.md — β layout, packages, OpenPLC sister-repo pattern
2Pick your vertical codeLowercase, not in reserved set (mrp, wms, …). Example: distillery, cosmetics
3Choose canonical modules to consumeOften automation + later mrp/wms; hospitality might be crm only — see vertical-configuration.md §Step 2
4Create your repositoryScaffold four β slices + vertical-flavored packages — normally outside umbraculum-dev
5Pin the MIT SDK@umbraculum/module-sdk (+ @umbraculum/*-contracts for domains you integrate with) — third-party-module.md
6Register at runtimeregisterModule({ code: "your-code", ... }) + web/native registration — mirror services/api/src/modules/brewery/
7Respect consumption contractNo parallel auth, billing, AI, i18n stack — RFC-0001 §8
8ShipTier 6 is permissionless — no mini-RFC. Full procedure: modules/contribute/vertical-configuration.md

Magento-shaped project layout (conceptual)

your-product-x/ ← your merchant project (NOT umbraculum-dev)
├── package.json ← depends on @umbraculum/module-sdk, your vertical packages
├── packages/
│ ├── productx-contracts/ ← @yourorg/productx-contracts
│ └── productx-domain-ui/ ← @yourorg/productx-ui
├── api/ ← or merge into a forked services/api slice
│ └── src/modules/productx/
├── web/ ← apps/web equivalent: (productx)/ routes
└── native/ ← optional native slice

umbraculum platform (upstream) ← backbone you track / deploy
├── horizontal platform + canonical modules
└── (optional) brewery reference ← you omit this in product X

Learning locally: cloning umbraculum-dev and running docker compose up is still the fastest way to study the platform and brewery reference — same as cloning Magento to learn before creating a clean merchant project.

Contributing a vertical into this monorepo: optional. Only the reference vertical (brewery) and core team's demos live here by policy. Your production vertical should default to your repo (GLOSSARY.md §"Where code lives").

Web app filesystem map

Where routes and shared code live under apps/web/app/ (terminology contract: backbone §3.7):

apps/web/app/[locale]/
_shared-layout/ # platform chrome (nav, footer, providers)
(auth)/ # login, signup, workspace select
(platform-layout)/ # platform horizontal pages (ai, accessibility, …)
(pim|mrp|crp|automation)/ # canonical module route groups
(brewery)/ # reference vertical
platform/ # cross-workspace admin (unchanged URL shape)

On-disk package tiers (RFC-0012):

packages/
platform/ # @umbraculum/ui, i18n, api-client, contracts, …
sdk/ # module-sdk, ai-tool-sdk, i18n-keys
canonical/ # pim/contracts, mrp/contracts, …
verticals/brewery/ # brewery-core, brewery-contracts, brewery-i18n, …

See NAVIGATE-MONOREPO.md and REPOSITORY-STRUCTURE.md §2–§3.

Where does my UI code go?

Use this decision tree when adding web UI or helpers (conventional terms — see backbone §3.7):

Used on web AND native with the same widget? → @umbraculum/<vertical>-* package
Platform-wide nav / footer / auth / providers? → app/_shared-layout/{_components,_lib}/
Module-only shared UI for one module code? → app/[locale]/(<code>)/{_components,_lib}/
Routable page (URL segment)? → app/[locale]/(<code>)/<segment>/
OR app/[locale]/(platform-layout)/<segment>/ (platform horizontal)
Cross-workspace admin (ads, platform recipes)? → app/[locale]/platform/ (unchanged)
Login / signup / workspace picker? → app/[locale]/(auth)/

(platform-layout)/ vs platform/ admin: (platform-layout)/ holds member-facing platform horizontal pages (AI consultant, accessibility statement, about) — same audience as module routes. platform/ is cross-workspace admin (platform recipe catalog, ads) with a distinct URL prefix; do not move admin pages into (platform-layout)/.

Package placement for a new vertical:

NeedPackageOn-disk path
Wire types + Zod schemas@umbraculum/<code>-contractspackages/verticals/<code>/contracts/
Locale JSON (vertical-only namespaces)@umbraculum/<code>-i18npackages/verticals/<code>/i18n/
PNG/SVG assets + manifest@umbraculum/<code>-media-assetspackages/verticals/<code>/media-assets/
Shared domain UI widgets@umbraculum/<code>-<feature>-uipackages/verticals/<code>/<feature>-ui/
Platform merge/loader only@umbraculum/i18n, @umbraculum/mediapackages/platform/ — no vertical content

API colocation: domain services belong under services/api/src/modules/<code>/services/ (Wave 3e). Do not add new vertical logic under services/api/src/services/ or domain/.

Known pre-flip gaps (documented, not fixed in Wave 6):

  • Cross-module (brewery)/_components imports — some canonical module pages still import brewery shared UI; prefer @umbraculum/brewery-recipes-ui or module-local _components/.

Not platform shared layout: a page's internal column/grid layout (recipe editor sections); Tamagui layout props; the POSIX command-line shell.


Question 2 — Running without brewery (today vs target)

You are building product X (distillery, hotel ops, cosmetics batch, internal PIM-only workspace, …). You do not want brewery recipes, brew-day flows, or @umbraculum/brewery-* in your workspace web UI.

Target (the Magento sample-data equivalent)

CapabilityTarget behavior
Platform installDepend on Umbraculum platform + chosen canonical modules without brewery artifacts
Reference verticalbrewery is optional — like Magento_SampleData* — not boot-registered unless you opt in
WorkspacePer-workspace module / add-on entitlements — hide routes, AI tools, and billing surfaces for modules not installed (RFC-0009, H1 2027)
Your verticalYour package registers alongside canonical modules; brewery never appears

brewery_module is already declared as an add-on code; enforcement is deferred (design/canonical-workspace-billing-addons-surface.md).

Installation profile (Waves A–F shipped 2026-06)

LayerCore profile (default)Reference opt-in (UMBRACULUM_MODULE_PROFILE=reference)
APIBrewery module not registered (services/api/src/app.ts)registerBreweryModule(app)
Web navBrewery segments omittedbrewery in builtin web modules
Nativeapps/native/blank (blank app)apps/native/brewery
Databasebrewery.* stripped after migrate (installation-profile.md)Full brewery.* schema
Workspace UI toggleInstall profile gate + optional add-on rows (RFC-0009 prep)Same

Fresh clone: docker compose upcore profile (brewery off) — see .env.sample and design/installation-profile.md.

Public demo host: demo.umbraculum.dev intentionally runs the reference profile (platform core plus brewery vertical) — one hosted illustration of how a Tier 6 vertical sits alongside canonical modules (design/demo-host-runbook.md). It is not a second demo for platform-only; integrators who omit brewery use UMBRACULUM_MODULE_PROFILE=platform in their own deploy (below).

Integrator without brewery: default fresh clone uses the core installation profile (UMBRACULUM_MODULE_PROFILE=platform). See docs/design/installation-profile.md.

Opt in to brewery (demo / walkthrough): UMBRACULUM_MODULE_PROFILE=reference or docker compose -f docker-compose.yml -f docker-compose.reference.yml up -d.

OpenAPI: ISVs on the platform profile should consume services/api/openapi/openapi.json only — the brewery add-on spec (openapi/brewery.json) documents the reference vertical and is omitted from platform-profile generation. Browse interactively on docs.umbraculum.dev/openapi-platform (platform) or docs.umbraculum.dev/openapi-brewery (reference vertical). For typed HTTP calls from your repo, prefer @umbraculum/api-client facades over raw fetch. See API-OPENAPI.md.

Workspace-level omit (hosted): seed brewery_module on demo workspaces; enable ENTITLEMENTS_ENFORCEMENT_MODE=tier_and_addons when testing omit semantics (RFC-0009).

Roadmap hooks

  • H1 2027 — RFC-0009 full enforcement: workspace add-on billing UI, Stripe, tier_and_addons purchase flows — installation profile gate already ships in 2026-06 (design/installation-profile.md)
  • AI / nav: respect installed modules only (design/canonical-ai-prompt-composition-surface.md §5 — today all boot-registered modules contribute)
  • Packaging: plugin-driven module registration from installed npm packages (RFC-0002 §3 — future packaging detail)

Where this is (and is not) documented already

TopicAlready documented?Where
Vocabulary + brewery as referenceYesGLOSSARY.md
Step-by-step vertical scaffoldYesmodules/contribute/vertical-configuration.md
Brewery worked exampleYesmodules/verticals/brewery/README.md §6
Vertical in your repo, not monorepoYesGLOSSARY.md §"Where code lives"; MODULES.md §3.2
Uninstall brewery / optional referenceYes (2026-06)design/installation-profile.md, design/brewery-vertical-lifecycle.md, FAQ #5 — this page adds Magento parallel
Single landing for both questionsThis pageBUILDING-YOUR-VERTICAL.md
First-time contributor (not vertical ISV)Different pathGETTING-STARTED.md