A Sitecore team can deliver a polished release and still leave the estate harder to change than it was before. That usually happens when brand logic, rendering code, personalization rules, and integration services share the same projects without clear ownership. A new campaign then touches pricing, navigation, search, and layout code at once, while developers spend more time tracing dependencies than delivering capability.
Helix architecture design gives that complexity a shape teams can govern. The principles are familiar, but their value becomes clearer in an XM Cloud estate where Sitecore AI and Sitecore Studio can increase the pace of content production, component variation, and personalization. The architecture still needs stable boundaries underneath that faster workflow.
Table of Contents
- Foundation establishes the platform contract
- Feature owns one business capability
- Project composes the site
- Foundation modules should expose narrow contracts
- Feature modules keep behavior together
- Project modules should compose, not accumulate
Why Helix Architecture Design Still Matters for Sitecore
A mid-sized retailer moved to XM Cloud with a flat solution. Three brand sites shared code, but feature flags sat too close to pricing logic, and a release that changed one experience could disrupt personalization in another. Authors saw inconsistent behavior, developers hesitated to touch shared components, and every deployment required a wide regression pass.
The team didn't solve that problem by adding more process. They introduced Helix boundaries around cross-cutting services, business capabilities, and brand composition. The result was a solution that made ownership visible again. Developers could identify where a change belonged, testers could target the affected capability, and technical decisions became easier to review.
That outcome reflects the central value of Helix. Sitecore defines the structure around Foundation, Feature, and Project, with higher layers depending on lower layers and not the other way around. Sitecore's Helix and JSS architecture overview describes this dependency direction and the deliberately thin role of Project. The rules don't remove complexity, but they stop complexity from spreading invisibly.
The architecture has to support change
Sitecore AI is positioned by Sitecore as a unified, enterprise-grade, AI-powered platform that brings content, data, and personalization together for modern marketing, while the wider portfolio includes Sitecore Studio as part of that product direction. Sitecore's platform overview provides that context. AI-assisted authoring can help teams create and adapt experiences, but it doesn't decide whether a component belongs to Foundation, Feature, or Project.
That distinction matters in multi-brand estates. Faster authoring increases the number of decisions the codebase must absorb. Without module discipline, generated or rapidly assembled experiences can encourage duplicated renderings, brand-specific exceptions in shared code, and unclear ownership of personalization services.
A useful architecture record should capture why a team made a boundary decision, not just what files changed. Resources on living codebase history with ADR offer a practical way to preserve those decisions as teams, vendors, and requirements change. Teams evaluating composable approaches can also use MACH architecture principles as a useful comparison point, particularly when deciding which capabilities should remain platform services and which should stay inside the Sitecore solution.
The practical questions are straightforward:
- Which layer owns the behavior?
- Which brand or tenant owns the composition?
- Can the module be tested and deployed without pulling unrelated features into the change?
- Does a shortcut reduce delivery friction, or does it create a dependency that future teams won't understand?
The rest of the design follows from those answers.
The Three Layers and Their Responsibilities
Helix works because each layer has a distinct job. Foundation provides shared technical capabilities, Feature implements a business capability, and Project assembles the experience for a particular site or brand. The dependency rule is unidirectional: Foundation depends on nothing above it, Feature depends on Foundation, and Project depends on both. Reverse arrows are architectural defects, even when the code appears convenient.

Foundation establishes the platform contract
Foundation contains concerns that multiple capabilities need but none should own exclusively. Dependency injection registrations, search abstractions, indexing support, taxonomy services, logging wrappers, configuration, and shared serialization conventions commonly fit here.
The test is reuse with stability. If a service exists only to support News, it probably belongs in Feature.News. If it defines how every feature accesses search, it may belong in Foundation.Search. Foundation shouldn't become a general dumping ground for code that hasn't found a home.
Feature owns one business capability
A Feature module should express a coherent capability such as News, Product Finder, Cart, or account management. Its controllers, models, services, pipelines, templates, and rendering behavior should remain close enough that a developer can understand the capability without searching across unrelated modules.
Feature modules can call Foundation services, but they shouldn't call Project code or reach directly into another Feature's implementation. Shared behavior between two Features should be extracted only when the shared contract is stable and cross-cutting. Copying a small value object can be healthier than creating a premature shared abstraction.
Project composes the site
Project is where a brand's pages, routes, layouts, composition rules, and site-specific presentation come together. It can reference Features and Foundation, but it should remain thin. A Project module shouldn't become the place where every uncertain decision lands.
Sitecore Studio and Sitecore AI may change how authors select, generate, personalize, or arrange content, but they don't change these ownership responsibilities. A generated component still needs a Feature or Project home, a rendering still needs a supported data contract, and a content authoring workflow still depends on templates and serialization that the team can govern.
Practical rule: If a module can't be described as either a shared technical capability, a single business capability, or a site composition concern, its boundary probably needs more design work.
Module Structure and Folder Conventions That Scale
A Helix module should be recognizable both in the repository and in Sitecore. That alignment reduces the time needed to trace a rendering from a content item to its code, tests, serialization, and deployment package. It also makes ownership easier to enforce through pull request rules and build checks.
A typical module has separate projects for its runtime concerns. A web project contains Sitecore-facing code and views, a class library holds reusable logic where appropriate, and an xUnit project tests the module without requiring the full platform. The Sitecore item structure should align with the module's ownership under paths such as /sitecore/templates, /sitecore/layouts, and /sitecore/system.

Foundation modules should expose narrow contracts
Consider Foundation.Serialization. Its serialization definitions should sit beneath the module's own name rather than in a shared, unowned folder. The same principle applies to search, dependency injection, configuration, and taxonomy. A Foundation module can expose an interface and a stable implementation, but it shouldn't know which brand page consumes the service.
That structure is the practical expression of modular design in software. The module boundary isn't decoration. It gives the team a place to test behavior, document ownership, and identify the impact of a change.
Feature modules keep behavior together
A Feature.News module might contain:
- Controllers and models: Map Sitecore data to the rendering contract without importing Project-specific presentation decisions.
- Services and pipelines: Implement news retrieval, filtering, indexing hooks, or validation for the News capability.
- Views and rendering definitions: Keep presentation assets close to the capability they render.
- Tests: Verify mapping, filtering, validation, and service behavior in isolation.
A Feature.ProductFinder module can follow the same shape, but it shouldn't reach into Feature.News to reuse an internal model. If both capabilities need a search client, that client belongs behind a Foundation contract or an explicitly shared service with a clear owner.
Project modules should compose, not accumulate
Project.Common can contain composite renderings, route handlers, brand composition, and site-specific configuration. A brand project may override a layout or choose a different component variant, but that choice shouldn't force shared Features to understand the brand.
The naming scheme also feeds CI/CD. A build can identify changed modules, run the relevant tests, validate item serialization, and reject project references from lower layers. Clear folders won't prevent every architectural mistake, but they make mistakes visible early, before they become deployment problems.
The video below provides a visual complement to the folder model and shows how teams can think about module boundaries in practice.
Multi-Tenant and Multi-Brand Module Strategies
Multi-brand Sitecore solutions need more than shared code. They need an ownership model for content, presentation, configuration, release decisions, and exceptions. Helix supplies the dependency direction, while the topology determines where teams place shared and brand-specific modules.
A hub-and-spoke model generally puts common Foundation and reusable Feature modules in the hub. Brand Projects act as spokes, composing those capabilities with site-specific layouts, content roots, dictionaries, and presentation details. This works well when brands share journeys but need independent composition and governance.
A multi-tenant model treats tenants as stronger ownership boundaries. Shared Foundation services remain centrally governed, while Features may be shared selectively or owned by tenant-aligned teams. Each tenant's Project layer controls its site composition. That arrangement can reduce accidental coupling, but it requires disciplined contracts around shared Features.
A multi-site model can be simpler when the brands are closely related. One solution may provide common Features, with separate site definitions and Project composition. The risk is that a shared Project layer becomes a disguised application layer, collecting brand exceptions until it violates the spirit of Helix.
Compare ownership before choosing topology
| Topology | Foundation ownership | Feature ownership | Project ownership | Best fit when |
|---|---|---|---|---|
| Hub-and-spoke | Central platform team | Shared capability teams | Brand or regional teams | Brands share journeys but need distinct composition |
| Multi-tenant | Central with tenant governance | Shared selectively, tenant-specific where needed | Tenant teams | Tenants have distinct ownership and release needs |
| Multi-site | Central or solution-wide | Common Features | Site-specific composition | Sites are closely related and share a delivery model |
| Single-tenant monolith with brand folders | One solution team | Shared within the monolith | Brand folders inside one Project boundary | Delivery speed matters more than strict isolation |
The multi-tenant architecture guide is useful background when deciding whether tenant isolation should exist in code, content, permissions, or all three. In XM Cloud, the content tree and Sitecore role configuration need to reflect the chosen ownership model. A team can't claim tenant isolation if authors, deployments, and shared configuration remain indistinguishable.
Where pragmatic deviation helps
A single-tenant monolith with brand folders can be the right call for a smaller estate or a program under delivery pressure. It bends Helix purity when brand-specific composition sits inside a broader Project structure, but it may avoid premature platform engineering. The boundary must still be documented, and shared Features must not absorb brand rules merely because the folders are convenient.
The same principle applies to shared Projects. If a shared composition module requires every brand to inherit an abstraction that only one brand needs, the arrangement has become expensive. Move the exception down into the relevant Project, or keep the shared contract smaller.
Headless Helix with Next.js and Sitecore AI
Headless delivery doesn't eliminate Helix. It relocates some responsibilities across the backend and frontend, so the team needs a clear mapping between Sitecore modules, rendering definitions, and Next.js components.
A practical split looks like this:
- Foundation: Shared SDK wrappers, API clients, logging, configuration contracts, and platform utilities.
- Feature: Content resolvers, search queries, mapping logic, and business rules for capabilities such as News or Product Finder.
- Project: Sitecore serialization for site composition, route configuration, presentation details, and brand-specific rendering choices.
- Next.js application: React components and page composition that consume stable rendering contracts, with shared frontend utilities kept separate from brand-specific presentation.
JSS placeholders still need predictable rendering resolution. A rendering selected in Sitecore should resolve to a known component contract, and the contract should identify which Feature owns its data and behavior. If a Project-specific component needs a Feature service, it should consume a public interface rather than import internal implementation details.
Sitecore AI changes the authoring loop
Sitecore AI and Sitecore Studio can reshape how teams propose layouts, create variations, and connect content to personalized experiences. The architecture review still needs to ask whether a suggested component is reusable, brand-specific, or a composite that belongs in Project.
The danger isn't automation itself. The danger is allowing authoring speed to create code duplication. A component variant that exists only because an author needed a visual distinction may not deserve a new Feature. It may belong in a controlled Project presentation variant, or it may expose a missing design-system contract.
The Next.js PWA approach offers relevant context for teams combining modern frontend delivery with experience platforms. The implementation detail matters less than the contract discipline. Frontend teams need stable data shapes, predictable placeholders, and ownership that doesn't require them to understand every Sitecore implementation detail.
Relax boundaries deliberately
Strict Helix can create unnecessary indirection in a headless solution. A small rendering helper may live beside a Project component when extracting it into Foundation would introduce a broad abstraction used nowhere else. That shortcut ages well when the helper is small, documented, tested, and clearly site-specific.
The shortcut ages badly when a Project helper reaches into another brand's component, embeds business rules that should live in Feature, or becomes the only way to access a shared service. The review question is simple: does the deviation reduce accidental coupling, or does it conceal it?
CI/CD Patterns for a Helix Solution
A Helix pipeline should make architectural intent executable. The repository's dependency graph, tests, serialized items, and deployment packages need to move through the same controlled process, rather than treating code and Sitecore configuration as unrelated artifacts.
Start with module-level validation. Each changed module should compile with its allowed references, run its unit tests, and validate serialization files. A Feature build shouldn't succeed if it references a Project assembly. A Foundation build shouldn't depend on a UI implementation merely because that implementation was convenient to access.
Build and test in dependency order
The build should follow the architecture from lower layers upward:
- Compile Foundation modules and run their unit tests.
- Compile Feature modules against approved Foundation contracts.
- Compile Project modules against the selected Features and Foundation packages.
- Validate serialized items for deterministic paths, naming, and ownership.
- Run integration and rendering tests where the environment supports them.
- Package and promote only the artifacts that pass the required checks.
Unicorn or Sitecore Content Serialization can support repeatable item deployment when teams control serialization ownership and avoid exporting unrelated content into the same package. Deterministic packaging matters because a deployment should show what changed, not reproduce accidental local edits.

Promote environments with a rollback plan
Promotion from development to test and production should include code, serialized definitions, configuration, and the content migration steps required by the release. Content-heavy changes need an explicit plan for database refreshes, migration scripts, or authoring actions. A code rollback can't repair a content structure that has already changed unless the team has planned the reverse operation.
Monolithic pipelines are easier to understand and can suit a compact team. Per-module pipelines offer narrower releases, but they add coordination overhead and can make compatibility management harder. The right choice depends on module independence. Don't split pipelines merely because the repository has many folders.
Adjacent SharePoint intranets often follow the same governance cadence even though they use a different development model. Microsoft describes SharePoint Framework, or SPFx, as a page and web part model for client-side SharePoint development, with integration to SharePoint data and extensions for Microsoft Teams and Microsoft Viva. Microsoft's SPFx overview also states that SPFx remains supported as the primary replacement technology after the SharePoint add-in model deprecation in SharePoint Online. Teams can share deployment runbooks, approval policies, and incident procedures without sharing code between Sitecore and SharePoint.
Keeping Helix Healthy Over Time
Architecture drift begins with reasonable exceptions. A team puts a brand-specific condition in a shared Feature, places a UI helper in Foundation, or lets one Project call another because the immediate release is urgent. The code still works, but future changes now require knowledge that the original boundary was designed to avoid.
Helix health needs an operating rhythm, not a one-time refactor. Review the dependency graph during architecture reviews, use NDepend or Helix.Check where they fit the solution, and make the build fail when a Feature references Project code or a Foundation class starts carrying UI concerns. A pull request template can require the author to name the target layer, business capability, public contract, and expected serialization impact.
Measure patterns, not vanity scores
A single metric rarely explains architectural decay. The architecture metrics guidance recommends balancing flow metrics such as deployment frequency, lead time for changes, change failure rate, and time to restore service with fitness functions for latency, error rate, and availability, plus structural measures for modularity and dependency health. These measures should support cross-functional learning, not individual performance scorecards.
For a friction-heavy subsystem, inspect clusters rather than isolated outliers. Useful indicators include CBO for coupling, LCOM for cohesion, WMC for class complexity, RFC for possible behaviors, DIT for inheritance depth, and NOC for derived-class pressure. The practical guide to software architecture metrics explains why several simultaneously poor signals are more actionable than one alarming number.
Dashboards can also track module count by layer, dependency fan-out, and time-to-render regressions. Those measures won't prove that a boundary is healthy, but a sudden change can tell the team where to investigate.
Keep hard rules hard
The unidirectional dependency rule should remain hard. So should the prohibition on hidden cross-Feature implementation references and on Foundation classes that depend on presentation details. A serialization folder shared by tightly coupled capabilities may flex if ownership, naming, and deployment behavior remain clear.
Use this quick-start checklist at the next Sitecore kickoff:
- Name the layers: Record what belongs in Foundation, Feature, and Project.
- Choose the topology: Decide whether hub-and-spoke, multi-tenant, multi-site, or a pragmatic monolith fits ownership.
- Define module templates: Include runtime projects, tests, serialization, README files, and naming conventions.
- Protect dependencies: Add automated checks for forbidden project references.
- Assign content ownership: Map templates, renderings, sites, roles, and serialization to modules.
- Plan exceptions: Document every relaxed boundary with an ADR and a review date.
- Connect metrics to learning: Review delivery flow, runtime fitness, and structural health together.
- Test the expansion path: Validate how a new brand, tenant, or AI-assisted component enters the estate.
A disciplined team doesn't preserve Helix by refusing every exception. It preserves Helix by making each exception visible, bounded, and reversible.
Kogifi helps enterprise teams design and maintain Helix-based XM Cloud estates, including headless Next.js builds, multi-brand governance, CI/CD, audits, and SharePoint solutions built with SPFx. Visit Kogifi to discuss an architecture review or a practical modernization plan for your Sitecore platform.














