Ensemble deployment

Public docs, private publishing.

Ensemble is deployed as a public Cloud Elephants documentation and preview surface, backed by a private signed build service for CMS publishing. The public site should not expose build webhook handlers.

private - Ensemble build service
publish - local/S3/R2 static artifacts
Service boundary
Layer
Public documentation site

ensemble.cloudelephants.com serves the splash page, block catalog, theme library, website-builder guide, recipe reviews, template previews, sitemap, and llms.txt.

Layer
Private build service

The Cloud Elephants CMS sends signed publish events to a private Ensemble service that validates snapshots, exports tenant sites, writes local generated-root artifacts, or uploads artifacts to S3/R2.

Layer
Tenant static hosting

Published tenant sites are served from the object-store and CDN layer, keeping public traffic separate from the internal build worker.

CMS publish contract

The private build service accepts HMAC-signed requests using X-Ensemble-Timestamp and X-Ensemble-Signature headers. The preferred route is the Cloud Elephants CMS publish endpoint; legacy routes stay available for compatible integrations.

The same private service serves its machine-readable OpenAPI contract at GET /openapi.json. That contract documents the publish payload, required signature headers, receipt lookup route, local directory output fields, and S3/R2 publish fields for the upstream Cloud Elephants CMS.

GET /openapi.json
POST /api/ensemble/cms/publish
POST /api/build/ensemble
POST /api/build/content
POST /api/build/wordpress
GET /receipts/<request_id>

When these handlers are hosted inside the Next app, they require ENSEMBLE_NEXT_BUILD_API_ENABLED=true. The public docs deployment should leave that flag unset so the routes return 404.