Skip to content

New: AI agent integration via Model Context Protocol (MCP).Learn more

Evolve Framework

The Evolve Framework contains the shared backend logic of the platform: GraphQL modules, resolvers, dataloaders, mappers, and the server runtime they plug into. It lives in its own repository (evolve-framework) and is published as @evolve-framework/* packages to the Evolve registry (npm.registry.evolve-platform.com). Implementations depend on it like any other library.

Every Evolve backend service used to ship with a complete copy of its GraphQL resolvers, schema definitions, dataloaders, mappers, and test infrastructure. A typical project contained hundreds of files and thousands of lines of code that was essentially identical across deployments. This created several problems:

  • Upgrade friction: pulling in platform improvements meant manually diffing and merging hundreds of files
  • Multiplied maintenance: a bug fix needed to be applied once per project instead of once
  • Unclear boundaries: it was hard to tell which code was platform baseline and which was project-specific

The framework repository contains 19 packages under packages/, all published under the @evolve-framework scope.

Package Description
core The module system (Module, AbstractModule, CompositeModule), the DomainService runtime, cache, messaging, storage, HTTP client, and observability
schemas GraphQL type definitions for every commerce domain, consumed by the implementation packages
json-schema-to-zod Converts JSON Schema definitions into Zod validators
packager Packages services into deployable artifacts (Docker, AWS Lambda, Azure Functions)
Package Description
commercetools GraphQL modules, resolvers, dataloaders, mappers, factories, and test tooling for commercetools
commercetools-adyen, commercetools-buckaroo, commercetools-invoice, commercetools-mollie, commercetools-paynl, commercetools-stripe Payment provider modules for the commercetools checkout, one package per provider
Package Description
contentful ContentfulModule with resolvers, a customizable mapper registry, and webhook handling
storyblok StoryblokModule, interchangeable with the Contentful package at the subgraph level
Package Description
sfcc Salesforce Commerce Cloud implementation modules (early stage)
cloud-adapter-aws, cloud-adapter-azure, cloud-adapter-gcp Cloud-specific bindings for messaging and storage
mcp-core Building blocks for MCP servers that expose GraphQL operations as AI tools
user-notifications Queued user notification client and message contracts

Implementations point the @evolve-framework scope at the Evolve registry in .npmrc and pin versions once, in the catalog: section of pnpm-workspace.yaml. Individual package.json files use catalog: as the version, so a framework upgrade is a one-line change.

New versions are published to the registry regularly; alongside stable releases, snapshot versions (0.0.0-<sha>-<timestamp>, npm tag snapshot) are published continuously, so unreleased work can be tested in an implementation before it is formally released. You consume both the same way: pin the version in your catalog:.

The framework owns everything that is the same across projects: modules, resolvers, schemas, dataloaders, mappers, and the server runtime. Your implementation owns everything that is specific to your project: configuration loading, module composition, context wiring, custom REST routes, event handlers, and any resolvers or mappers you override or add. See Customization and extensibility for the extension points.

Does the GraphQL API change when I upgrade? Not silently. The schema each service exposes is defined by the modules it composes; schema changes arrive through explicit version bumps and are documented in the package changelogs.

Can I stay on an older framework version? Yes. Framework packages are versioned and pinned in your catalog:. You upgrade on your own schedule.

When should I use a snapshot version? Only to validate unreleased framework changes against your implementation. Production deployments should pin released versions.